JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

小心 Nginx 的 add_header 指令 nginx $remote_addr

wys521 2024-10-25 18:35:10 精选教程 27 ℃ 0 评论

转载请注明文章出处:https://tlanyan.me/be-careful-with-nginx-add_header-directive/

昨天无聊用 curl查看一个站点的信息,发现返回的头部与想象中的不一样:

HTTP/2 200
date: Thu, 07 Feb 2019 04:26:38 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding, Cookie
cache-control: max-age=3, must-revalidate
last-modified: Thu, 07 Feb 2019 03:54:54 GMT
X-Cache: Miss
server: cloudflare
...

主站点在 nginx.conf中配置了 HSTS 等 header:

add_header Strict-Transport-Security "max-age=63072000; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

但响应头部没有这些 header。除了常规的 header,仅出现了一个配置配置在 location中的header X-Cache。

第一印象是 CDN 过滤了这些 header?于是找 Cloudflare的文档,没发现会对这些进行处理。转念一想,CDN 过滤这些干啥啊?吃饱了撑的啊?他们又不搞 zheng 审那一套!

问题转移到 Nginx 的配置上。打开 Google 搜索 "nginx location add_header",果然发现不少槽点。点开官网 add_header的文档,有这样的描述(其他信息已省略):

There could be several addheader directives. These directives are inherited from the previous level if and only if there are no addheader directives defined on the current level.

注意重点在 “These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level. ”。即:仅当当前层级中没有 add_header指令才会继承父级设置。所以我的疑问就清晰了: location中有 add_header, nginx.conf中的配置被丢弃了。

这是 Nginx的故意行为,说不上是 bug 或坑。但深入体会这句话,会发现更有意思的现象:仅最近一处的 add_header起作用。 http、 server和 location三处均可配置 add_header,但起作用的是最接近的配置,往上的配置都会失效。

但问题还不仅于此。如果 location中 rewrite到另一个 location,最后结果仅出现第二个的 header。例如:

location /foo1 {
 add_header foo1 1;
 rewrite / /foo2;
}
location /foo2 {
 add_header foo2 1;
 return 200 "OK";
}

不管请求 /foo1还是 /foo2,最终 header 只有 foo2:

尽管说得通这是正常行为,但总让人感觉有点勉强和不舒坦: server丢掉 http配置, location丢掉 server配置也就算了,但两个 location在同一层级啊!

不能继承父级配置,又不想在当前块重复指令,解决办法可以用 include指令。

参考

  1. Nginx Module ngxhttpheaders_module
  2. Nginx add_header configuration pitfall
  3. Be very careful with your add_header in Nginx! You might make your site insecure
  4. addheader directives in location overwriting addheader directives in server
  5. nginx 配置之 add_header 的坑

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表