浏览 2.3k
这是之前踩过的坑,我们要在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';
}
}
虽然阴差阳错解决了问题,不过不明白其中的原理,所以想请教一下陶辉老师这个问题。
按点赞数排序
按时间排序
我重新安装了1.4.7版本,试了下,还是没有你说的现象。建议你重新试下,或者贴出你完整的配置文件,以及测试方法,咱们一次性彻底搞明白。
就我的经验来说,只有连续的if会出错,你上面列出的仅有1个if,通常不应该有问题,我也很好奇。
给你看下我的配置和运行结果:
2
回答于2020-07-14 08:49
你这是不完整的配置吗?你列出的这两种配置没有差别。我在服务器上拷贝验证了这两个配置,输出完全一致:
以及:
我猜测你之所以出问题,是在同一个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
worker_processes 是用来设置worker进程数量的,auto只是根据CPU核心数来配置worker进程数,它与sched_setaffinity调用,也就是CPU亲和性无关。应该是你的 worker_cpu_affinity指令配错了,你改成worker_cpu_affinity auto;看看。