最常用方式是在location块中用add_header指令设置响应头,按路径前缀或文件类型精准配置,注意always参数控制错误响应头、避免if/rewrite中使用及继承问题。

直接在 location 块中用 add_header 指令设置,是最常用也最稳妥的方式。它不改变请求流程,只附加元信息,适合做缓存控制、安全标识或调试标记。
按路径前缀精准设置响应头
适用于有明确目录结构的静态资源,比如 /css/、/js/、/images/ 等。
- 每个
location /xxx/只影响以该路径开头的请求,彼此隔离,互不干扰 - 在对应块内显式声明
add_header,未写的头不会从上级继承 - 建议配合
alias或root正确定位文件真实路径
示例:
location /css/ {<br> alias /var/www/static/css/;<br> add_header Cache-Control "public, max-age=31536000, immutable";<br> add_header X-Content-Type-Options "nosniff";<br>}
location /admin/ {<br> alias /var/www/static/admin/;<br> add_header Cache-Control "no-store, no-cache";<br> add_header X-Frame-Options "DENY";<br>}
按文件类型统一设置响应头
适合对所有同类资源(如图片、字体)做一致处理,不管它们放在哪个路径下。
- 使用正则匹配扩展名:
location ~* \.(png|jpg|gif|webp|woff2?)$ - 正则 location 优先级高于普通前缀匹配,建议放在配置靠后位置
- 可结合
root定位文件,并添加通用安全头或缓存策略
示例:
location ~* \.(png|jpg|jpeg|gif|webp|ico)$ {<br> add_header Cache-Control "public, max-age=2592000";<br> add_header X-Content-Type-Options "nosniff";<br>}
注意状态码范围与 always 参数
add_header 默认只在 200、201、204、206、301–304、307、308 等响应中生效;4xx/5xx 错误响应里不会输出。
- 若需在错误响应中也透出(如调试用的
X-Backend),加always参数:add_header X-Env "prod" always; - 但敏感头(如
Set-Cookie)加always可能被浏览器拒绝,需谨慎评估 - 同一名称的 header 在
location中声明会覆盖server级配置,不是合并
避免常见配置陷阱
- 别在
if或rewrite块中写add_header—— 它们不支持该指令,且逻辑易出错 - 不要依赖继承:父级写了
X-Service,子location里没写,就不会带这个头 - 修改配置后务必执行
nginx -s reload生效,不要只重启进程 - 用
curl -I验证响应头,注意区分 200 和 404/500 场景下的表现











