千家信息网

为何要小心Nginx的add_header指令详解

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,前言大家都知道,nginx配置文件通过使用add_header指令来设置response header。昨天无聊用curl查看一个站点的信息,发现返回的头部与想象中的不一样:HTTP/2 200dat
千家信息网最后更新 2025年12月02日为何要小心Nginx的add_header指令详解

前言

大家都知道,nginx配置文件通过使用add_header指令来设置response header。

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

HTTP/2 200date: Thu, 07 Feb 2019 04:26:38 GMTcontent-type: text/html; charset=UTF-8vary: Accept-Encoding, Cookiecache-control: max-age=3, must-revalidatelast-modified: Thu, 07 Feb 2019 03:54:54 GMTX-Cache: Missserver: 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 add_header directives. These directives are inherited from the previous level if and only if there are no add_header 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指令。

参考

  • Nginx Module ngx_http_headers_module
  • Nginx add_header configuration pitfall
  • Be very careful with your add_header in Nginx! You might make your site insecure
  • add_header directives in location overwriting add_header directives in server
  • nginx 配置之 add_header 的坑

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

配置 指令 作用 信息 内容 头部 层级 文档 疑问 行为 这是 问题 参考 学习 舒坦 无聊 有意思 说不上 两个 主站点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 滨湖区互联网智能科技产品是什么 大学生网络安全危险 苍之骑士团2服务器排行 打印机如何清0数据库 驱动开发和软件开发的不同 鹿泉区技术软件开发服务咨询报价 《网络安全法》第七十六条 关系型数据库oracle 跨境数据网络安全难点 怎么打开怪物数据库 重庆英睿特互联网科技有限公司 计算机网络安全证培训资料 实现缓存服务器 辽宁服务管理软件开发公司 嘉兴同众网络技术有限公司怎么样 嵌入式软件开发工具的发展趋势是 教师编制网络技术 我的世界小服务器地址 模拟器无法连接服务器 陈兴蜀 获网络安全 好彩运软件开发商 我的世界非服务器怎么联机 查找snp位点用的数据库 校园共享电瓶车软件开发 长沙裕帮软件开发有限公司 云服务器数据库和程序分开 服务器适配什么硬盘 商场网络安全管理员 bms软件开发怎么样 知乎 互联网和科技结合
0