Nginx中如何通过http段带变量的响应头配置实现全局头继承与location段动态头值修改
Nginx中如何通过http段带变量的响应头配置实现全局头继承与location段动态头值修改
相信很多用Nginx的朋友都踩过这个坑:在http段全局配置了一堆通用响应头,结果到某个特定的location段,想单独修改某个头的值或者新增一个头时,只要一写add_header指令,之前全局设置的那些响应头就全部失效了!
这可不是bug,是Nginx的既定规则:
只有当当前配置层级没有定义
add_header指令时,才会继承上一层级的这些指令。
我之前就遇到这么个场景:想在http段统一加全局响应头,但有一个特定的响应头,它的值得在location段里经过路径映射后才能确定。如果直接在location里写add_header,那http段的所有头都得重新复制一遍,不仅麻烦,后续维护也容易出错。
后来摸索出一个靠谱的解决办法——用变量+map来实现动态响应头,同时保留全局头的继承:
具体配置思路
- 在http段用变量定义需要动态修改的响应头,这样这个头会被所有location继承
- 因为http段不能直接用
set指令,所以用map来初始化这个变量的默认值 - 在需要调整头值的location段里,用
set修改变量的值,就能动态改变响应头的内容,而且不会影响全局头的继承
示例配置
http { # 全局通用响应头,正常配置即可 add_header X-Global-Common "Global Default"; add_header X-Cache-Control "max-age=3600"; # 用map初始化动态变量,默认值可以设为通用场景的值 map $request_uri $dynamic_header_val { default "Normal Request"; } # 在http段定义带变量的响应头,所有location都会继承这个配置 add_header X-Request-Type $dynamic_header_val; server { listen 80; server_name your-domain.com; # 需要自定义头值的location location /api { # 在这里修改变量的值,无需重复写全局add_header set $dynamic_header_val "API Request"; # 其他业务配置,比如反向代理 proxy_pass http://your-api-backend; } # 普通location,使用默认的变量值 location / { root /usr/share/nginx/html; index index.html; } } }
为什么这个方法有效
- 所有location都会自动继承http段的全部
add_header配置,包括那个带变量的动态头 - 只有在需要调整的location里修改变量值,就能覆盖默认的响应头内容,不会触发Nginx“不继承上层add_header”的规则
- 不用重复复制全局头配置,后续维护全局头时只需要修改http段即可,非常方便
备注:内容来源于stack exchange,提问作者Johannes H.
相关产品推荐
相关产品推荐

