nginx 跨域问题

一、什么是跨域?

        当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

当前页面url

被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域

端口号不同(8080/7001)

二、为什么会出现跨域?

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

三、一般出现跨域时的报错信息

        我遇到的情况:访问页面,点击登录按钮后,浏览器发出了请求方式为OPTIONS

         点浏览器的Console控制台,发现报跨域的错。请求后端1504 端口被拒绝。

         解决跨域问题方式有很多种,我是在nginx代理层处理。在后端接口配置文件中(即1504端口配置文件),加上以下配置,转发时添加头部信息,Access-Control-Allow-Origin 等。

    location ~ \.php/?.*$ {
        add_header "Access-Control-Allow-Origin" $http_origin always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'OPTIONS, POST, GET' always;
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;

        try_files $uri /index.php =404;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index  index.php;
        fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
 

        但是加上后,发现还是有报错:has been blocked by CORS policy: Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response. 已被cors策略阻止:Access-Control-Allow-Headers 在响应中不允许请求标头字段Authorization

         那么咱们就在上面的nginx配置文件中把Authorization 加上。再次重载nginx配置文件即可。

add_header 'Access-Control-Allow-Headers' 'Authorization,Origin, X-Requested-With, Content-Type, Accept' always;

四、重复跨域

        不知道大家有没有遇到过重复跨域,就是在别的地方配置了跨域如网关,或php代码里,然后你在nginx上又配了一次,导致访问报错 has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header contains multiple values;

        我这边就是把nginx上允许跨域的几行注释了,就好了。因为不知道在哪还配置了别的跨域。 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值