回答
收藏
分享
举报
nginx在反向代理时增加跨域头的顺序问题
提问于2020-07-09 21:38

浏览 2.8k

这是之前踩过的坑,我们要在a.example.com某个目录里面增加允许b.example.com的跨域请求,原来的配置是这样:

location /static/ {
proxy_pass http://backend;
proxy_set_header Host $host;
}

然后我一开始是改为了下面的配置:

location /static/ {
if ($http_origin ~* ((http|https)?://b\.example\.com$)) {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
}
proxy_pass http://backend;
proxy_set_header Host $host;
}

但是这样是不生效的,调试了一段时间,期间尝试增加了各种跨域相关的其他头,都没有作用,然后尝试调整了跨域配置的位置就好了,调整成了以下这样就可以了:

location /static/ {
proxy_pass http://backend;
proxy_set_header Host $host;
if ($http_origin ~* ((http|https)?://b\.example\.com$)) {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
}
}

虽然阴差阳错解决了问题,不过不明白其中的原理,所以想请教一下陶辉老师这个问题。

已修改于2023-03-17 02:09



写下您的回答
发表回答
全部回答(3)

按点赞数排序

按时间排序

我重新安装了1.4.7版本,试了下,还是没有你说的现象。建议你重新试下,或者贴出你完整的配置文件,以及测试方法,咱们一次性彻底搞明白。

就我的经验来说,只有连续的if会出错,你上面列出的仅有1个if,通常不应该有问题,我也很好奇。

给你看下我的配置和运行结果:



赞同

2

回复举报

回答于2020-07-14 08:49



回复陶辉
回复
陈祥振回复了
非常抱歉,陶辉老师,浪费了您这么多时间,这个问题是我在以前的公司遇到的了,完整的配置我现在也拿不到了。只不过当时确实这个问题调试了一些时间才解决的,然后我也记到了有道云笔记上,所以比较有印象。上次听课的时候刚好是在说nginx的头信息,就想起来这个问题。现在看来,还是我的求真心不够,给您添麻烦了。

2

回复举报

回答于2020-07-14 07:54



回复陈祥振
回复
陶辉回复了
没关系,估计你应该是连续if引发的问题

2

回复举报

回答于2020-07-14 08:01



回复陶辉
回复

把配置回滚回去截图看看,哈哈

赞同

2

回复举报

回答于2020-07-10 09:45



回复Omg
回复

你这是不完整的配置吗?你列出的这两种配置没有差别。我在服务器上拷贝验证了这两个配置,输出完全一致:


以及:

我猜测你之所以出问题,是在同一个location中出现了多个if所致的。

首先,if就像location一样,会生成独立的子配置块,其中,它会继承或者覆盖父配置块中的指令。比如,location中有add_header指令时,如果if中也有,不管是否为同一个header,if也会完全替换掉它。
其次,当1个location中含有多个if时,仅最后1个if会生效。if指令出错,都是多个连续处理1个请求所致,你看下https://time.geekbang.org/course/detail/100020301-79639这节课。

你仅用自己列出的配置试下看看。


赞同

1

回复举报

回答于2020-07-10 08:22



回复陶辉
回复
陈祥振回复了
没有,location里面的内容就这么多

2

回复举报

回答于2020-07-10 11:34



回复陈祥振
回复
陶辉回复了
@456:完整的nginx.conf文件放上来看看

2

回复举报

回答于2020-07-10 23:27



回复陶辉
回复
陈祥振回复了
陶辉老师,我怀疑可能是版本导致的问题,以前的公司用的是很老的版本,nginx-1.4.7,这个问题我是确确实实遇到的,当时还做了笔记的。但您说没问题,我也再次验证了一下,我验证也确实是放在前后都没影响了,现在用的版本是nginx-1.12.1

2

回复举报

回答于2020-07-13 02:11



回复陈祥振
回复
提问者
陈祥振
这家伙很懒还未留下介绍~
0
文章
1
问答
2
粉丝
相关问答

性能最高的方案是在内存中用状态机来处理,比较复杂;最简单的方案是将响应缓存到文件中,再读取文件处理。

点赞 0
浏览 946

看下error.log日志,先确认下是哪个URL引发了重定向。

点赞 0
浏览 2.1k

跟nginx或者服务器没关系。如果是windows PC,建议把防火墙全部关闭试试

点赞 0
浏览 832