nginx在反向代理时增加跨域头的顺序问题

这是之前踩过的坑,我们要在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';
}
}

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

邀请回答
提问于 2020-07-09 21:38
621 次浏览
共3个回答

发表评论
  • 陶辉
    2020-07-14 08:49

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

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

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



    2
    回复
    举报
    • 陈祥振 2020-07-14 15:54
      非常抱歉,陶辉老师,浪费了您这么多时间,这个问题是我在以前的公司遇到的了,完整的配置我现在也拿不到了。只不过当时确实这个问题调试了一些时间才解决的,然后我也记到了有道云笔记上,所以比较有印象。上次听课的时候刚好是在说nginx的头信息,就想起来这个问题。现在看来,还是我的求真心不够,给您添麻烦了。
      0
      回复
      举报
    • 陶辉 2020-07-14 16:01
      没关系,估计你应该是连续if引发的问题
      0
      回复
      举报
  • Omg
    2020-07-10 09:45

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

    0
    回复
    举报
  • 陶辉
    2020-07-10 08:22

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


    以及:

    我猜测你之所以出问题,是在同一个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这节课。

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


    0
    回复
    举报
    • 陈祥振 2020-07-10 19:34
      没有,location里面的内容就这么多
      0
      回复
      举报
    • 陶辉 2020-07-11 07:27
      @456:完整的nginx.conf文件放上来看看
      0
      回复
      举报
    • 陈祥振 2020-07-13 10:11
      陶辉老师,我怀疑可能是版本导致的问题,以前的公司用的是很老的版本,nginx-1.4.7,这个问题我是确确实实遇到的,当时还做了笔记的。但您说没问题,我也再次验证了一下,我验证也确实是放在前后都没影响了,现在用的版本是nginx-1.12.1
      0
      回复
      举报
提问者

陈祥振

恒大财富运维工程师

  • 0

    文章

  • 0

    粉丝

  • 0

    被赞

您已邀请位用户
版权所有©F5 Networks,Inc.保留所有权利。京ICP备16013763号-5