摘要:场景最近有个上传图片的需求,为了分流,将接口部署到另一个多带带的域名,所以需要解决跨域的问题。同时只能对指定子域名放开访问权限,所以设置如下。实现还好支持指令,对域名做下正则校验就可以实现指定子域名跨域。
场景
最近有个上传图片的需求,为了分流,将接口部署到另一个多带带的域名,所以需要解决跨域的问题。
思路一开始想着在后端代码直接设置cors策略,后来发现请求都是从nginx进入,所以将cors移动到nginx下实现。同时只能对指定子域名放开访问权限,所以设置如下。
Access-Control-Allow-Origin *.test.com
亲测不可用,只能是*和指定的域名。
实现还好nginx支持if指令,对域名做下正则校验就可以实现指定子域名跨域。
接下来测试发现浏览器的options发到后端后,没有处理返回了一些莫名其妙的东西。
好吧直接在nginx返回不发给后端,还是用if指令判断http请求类型。
这里就用了两个if,最坑的事情出现了,nginx在多个if指令下,有些指令是最后一个if才有效,前面的会被覆盖。
最终还是直接重复add_header解决。
客户端ajax请求withCredentials属性设置为true才会发送cookie。
同时cookie要是上传域名可用的,不然还是要通过url参数等方式去传递。
location / { # 检查域名后缀 if ($http_origin ~ .test.com) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type; add_header Access-Control-Max-Age 1728000; } # options请求不转给后端,直接返回204 # 第二个if会导致上面的add_header无效,这是nginx的问题,这里直接重复执行下 if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type; add_header Access-Control-Max-Age 1728000; return 204; } # 其他请求代理到后端 proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://xxx.xxx.xxx.xxx; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39697.html
摘要:目前,所有浏览器都支持该功能,浏览器不能低于。因此,实现通信的关键是服务器。如果指定的域名在许可范围内,服务器返回的响应,会多出头信息字段也可能多出其他可选字段或者是表示接受任意域名的请求。 实际跨域问题及其解决方案 1.课题:ajax实现跨域访问 2.背景: 1.画面服务器:192.168.196.6 → tomcat服务2.js模板服务器:192.168.196.8 → ngi...
摘要:最近写了一些关于前后端分离项目之后,跨域相关方案的基本原理和常见误区的帖子,主要包括和反向代理。反向代理此时后端相当于不跨域,和正常请求一致,无需额外配置。 最近写了一些关于前后端分离项目之后,跨域相关方案的基本原理和常见误区的帖子,主要包括CORS和Nginx反向代理。这两种方案项目中都有在用,各有优缺,关于具体使用哪种方案,大家的观点也不大一致,本文主要就此展开一下,从前后端及服务...
阅读 3143·2021-11-23 10:02
阅读 3118·2021-11-16 11:53
阅读 3093·2021-09-23 11:21
阅读 3369·2019-08-30 13:02
阅读 1622·2019-08-29 16:18
阅读 1557·2019-08-29 12:55
阅读 1457·2019-08-26 12:24
阅读 2085·2019-08-26 10:36