Nginx CORS 跨域资源共享问题
## 背景
新项目上线,前后端分离,遇到了跨域资源共享的问题,导致请求根本无法发送到后端,前端和后端貌似只能有一个来处理跨域问题,我们这边要采用nginx来解决跨域问题。
## Nginx的CORS配置
网上好像都是三两行解决问题。可是我这边试了很多次,也没用。
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
## 上最终的配置文件
server
{
listen ;
server_name api.example.com;
index index.jsp index.htm index.html index.do login.vm;
charset utf-;
location /
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.150.184:10000;
}
location /pm/ {
add_header Access-Control-Allow-Origin 'http://pm.example.com';
add_header Access-Control-Allow-Headers 'DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-Auth-Token';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
add_header Access-Control-Expose-Headers 'X-Auth-Token';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.150.184:10000/;
if ($request_method = 'OPTIONS') {
add_header Access-Control-Max-Age "" ;
add_header Access-Control-Allow-Origin 'http://pm.example.com';
add_header Access-Control-Allow-Headers 'DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-Auth-Token';
add_header Access-Control-Expose-Headers 'X-Auth-Token';
return ;
}
}
access_log /data/logs/example_com_access wwwlog;
error_log /data/logs/example_com_error ;
}
上诉的配置文件中,为何要加if判断呢????
因为POST请求,浏览器会发送一个options的预检请求,主要是将本次的请求头发送给服务端,若服务端允许,再发送真正的POST请求,所以F12看到,经常POST会发送两次请求。因为后端java代码没有对options请求做处理。
导致options接口请求的时候,抱403 forbidden,这里nginx对options的请求直接返回200,不用到达接口层,直接允许POST响应头,即可使得上述失效配置能够生效。
## Nginx proxy_pass详解
参考地址:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
https://segmentfault.com/a/1190000020725137
https://www.hi-linux.com/posts/60405.html
https://blog.csdn.net/weixin_43475207/article/details/90172613
https://blog.csdn.net/envon123/article/details/83270277
http://coderq.github.io/2016/05/13/cross-domain/
https://www.jianshu.com/p/1080014a234f
最新文章
- Handler系列之创建子线程Handler
- 吐个槽:bose的售后真心差劲!愧对这个顶级音响产品!
- Eclipse开发工具组合键介绍
- spring定时器设置(转自:http://my.oschina.net/LvSantorini/blog/520049)
- SVN Unable to connect to a repository at URL
- CAS 在 Tomcat 中实现单点登录
- 【webpack】-- 自动刷新
- 编写第一个python selenium程序(二)
- Three.js与webVR
- Java求循环节长度
- Android学习——移植tr069程序到Android平台
- Vscode生成verilog例化
- 小程序 第一个学习示例(TodoList)
- Python学习周末练习1-用户登录
- ningx.conf location
- Porsche Piwis Tester II V12.100 Version Released
- js 小说格式整理
- ueditor 功能定制
- 配置codis-proxy
- linux中find命令