nginx怎么解决跨域(nginx解决前端跨域问题)

写在前面

当今互联网行业,大部分Web项目基本都是采用的前后端分离模式。前端为H5项目,后端为Java、PHP、Python等项目。而且大部分后端服务并不会只部署一套服务,而是会采用Nginx对后端服务进行负载均衡。那么,此时就会出现一个问题了:如果一个请求url的 协议、域名、端口 三者之间任意一个与当前页面url不同就会产生跨域的现象。那么如何使用Nginx解决跨域问题呢?接下来,我们就一起探讨下这个问题。

为何会跨域?

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

Nginx如何解决跨域?

这里,我们利用Nginx的反向代理功能解决跨域问题,至于,什么是Nginx的反向代理,大家就请自行百度或者谷歌吧。

Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而Nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

Nginx解决跨域案例

使用Nginx解决跨域问题时,我们可以编译Nginx的nginx.conf配置文件,例如,将nginx.conf文件的server节点的内容编辑成如下所示。

server {        location / {            root   html;            index  index.html index.htm;            //允许cros跨域访问            add_header 'Access-Control-Allow-Origin' '*';        }        //自定义本地路径        location /apis {            rewrite  ^.+apis/?(.*)nbsp;/$1 break;            include  uwsgi_params;            proxy_pass   http://www.binghe.com;       }}

然后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.binghe.com/apistest/test 变为 http://www.binghe.com/apis/apistest/test然后成功解决。

假设,之前我在页面上发起的Ajax请求如下所示。

$.ajax({        type:"post",        dataType: "json",        data:{'parameter':JSON.stringify(data)},        url:"http://www.binghe.com/apistest/test",        async: flag,        beforeSend: function (xhr) {            xhr.setRequestHeader("Content-Type", submitType.Content_Type);            xhr.setRequestHeader("user-id", submitType.user_id);            xhr.setRequestHeader("role-type", submitType.role_type);            xhr.setRequestHeader("access-token", getAccessToken().token);        },        success:function(result, status, xhr){        }        ,error:function (e) {            layerMsg('请求失败,请稍后再试')        }    });

修改成如下的请求即可解决跨域问题。

$.ajax({        type:"post",        dataType: "json",        data:{'parameter':JSON.stringify(data)},        url:"http:www.binghe.com/apis/apistest/test",        async: flag,        beforeSend: function (xhr) {            xhr.setRequestHeader("Content-Type", submitType.Content_Type);            xhr.setRequestHeader("user-id", submitType.user_id);            xhr.setRequestHeader("role-type", submitType.role_type);            xhr.setRequestHeader("access-token", getAccessToken().token);        },        success:function(result, status, xhr){        }        ,error:function (e) {            layerMsg('请求失败,请稍后再试')        }    });

好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!

nginx怎么解决跨域(nginx解决前端跨域问题)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论