【Nginx】使用Nginx如何解决跨域问题?看完这篇原来很简单!!

写在前面

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

为什么会跨域?

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

Nginx如何解决跨域?

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

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

Nginx解决跨域案例

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

server {
        location / {
            root   html;
            index  index.html index.htm;
            //容许cros跨域访问
            add_header 'Access-Control-Allow-Origin' '*';

        }
        //自定义本地路径
        location /apis {
            rewrite  ^.+apis/?(.*)$ /$1 break;
            include  uwsgi_params;
            proxy_pass   http://www.binghe.com;
       }
}
复制代码

而后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.binghe.com/apistest/test 变为 www.binghe.com/apis/apiste…web

假设,以前我在页面上发起的Ajax请求以下所示。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('请求失败,请稍后再试')
        }
    });
复制代码

修改为以下的请求便可解决跨域问题。json

$.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('请求失败,请稍后再试')
        }
    });
复制代码

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

写在最后

若是你以为冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!很多读者已经经过阅读「 冰河技术 」微信公众号文章,成功跳槽到大厂;也有很多读者实现了技术上的飞跃,成为公司的技术骨干!若是你也想像他们同样提高本身的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,天天更新超硬核技术干货,让你对如何提高技术能力再也不迷茫!api

相关文章
相关标签/搜索