nginx配置导致的已阻止跨源请求同源策略禁止读取位于xxx的远程资源,原因CORS头缺少‘access control allow origin’

1、第一种情况

在nginx为统一域名配置了http和https后,访问https时会出现对另一个的跨域访问,需要在nginx配置文件中location处添加如下内容:

解决方法:

        location / {
                add_header 'Access-Control-Allow-Origin' 'http://前端域名';
        }

2、第二种情况

前端使用ajax跨域post数据,当nginx已经配置了header,Access-Control
-Origin 依然提示缺少Origin头部,问题分析

现象

仔细查看,发现post请求的发送时,post请求变成了options请求,post请求的content-type是application/json

原因

这是由于浏览器跨域请求时产生的preflight request问题,为了安全,会先发送一个options请求,浏览器获取到响应后判断header的跨域允许的域名,即服务器设置的Access-Control-Allow-Origin域名列表中是否符合当前浏览器中的域名,如果符合,再进行下一步post请求,并且这种情况时在非简单请求的情况下,简单请求与非简单请求移步阮一峰的详细说明简单请求与非简单请求,简单来说就是

  1. 请求方式:
  • HEAD
  • GET
  • POST
  1. 请求头信息
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type 对应的值是以下三个中的任意一个
                        application/x-www-form-urlencoded
                        multipart/form-data
                        text/plain

只有同时满足以上两个条件时,才是简单请求,否则为非简单请求
当非简单请求时浏览器会进行预请求,即preflight request
在这里插入图片描述
但是如果服务器没有处理第一步options请求的方法,那么第一步的options请求就不会获取到正确的header,也就无法判断当前域名是否符合跨域规则,那么就不会进行下一步的post请求, 所以浏览器就会提示跨域缺少Access-*-Origin头部, 知道了原因

解决方法

举例nginx:
在add_header配置后添加处理options请求的方法,如下:

location / {  
    add_header 'Access-Control-Allow-Origin' 'http://localhost:8080';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

    if ($request_method = 'OPTIONS') {
        return 204;
    }
} 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值