nginx中proxy_set_header的一个坑

一个应用有多个域名同时指向,所以在程序中需要通过servername来获得访问的域名来进行不同的处理。
在测试环境没有任何问题,但是到了线上就出问题了,上网查了相关资料,解决的方法是在 location / 的设置中,增加 proxy_set_header Host $host即可。可是在我们的线上nginx中的http设置中已经设置了proxy_set_header Host $host,对于nginx的配置来说 http > server > location,所以按理说应该有这个设置了,应该有效的。
anyway,线上的问题总需要解决,于是尝试着在 location 中又增加了一遍 proxy_set_header Host $host,启动后验证,居然生效了!!
这个到底是怎么回事啊?于是到官网查文档,看到下面一段话:

Allows redefining or appending fields to the request header passed to the proxied server. 
The value can contain text, variables, and their combinations. 
These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level. 

注意到上面有一句话:”These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level.” 也就是说确实是按照 http > server > location 的顺序来传递关系,但是假如当前的级别中出现了任意一个proxy_set_header,那么在 http 或者 server 中定义的 proxy_set_header 都将失效,需要重新再定义一遍。

oh,my god,还有这么大的一个坑。

BTW:在nginx的关于proxy_set_header文档中,还说明了:
proxy_set_header Host $http_host;
proxy_set_header Host $host;
这两者的区别。
$http_host只认用户的HEADER中的HOST,假如没有那就是为空;而$host是首先认用户的HEADER中的HOST,假如为空,就用 nginx 中的 server_name 设置。所以,$host要比 $http_host 好。

发表评论

邮箱地址不会被公开。 必填项已用*标注