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请求,并且这种情况时在非简单请求的情况下,简单请求与非简单请求移步阮一峰的详细说明简单请求与非简单请求,简单来说就是
- 请求方式:
- HEAD
- GET
- POST
- 请求头信息
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;
}
}