nginx的 add_header 是给谁添加的?

nginx 中的 add_header 指令是 向 HTTP 响应头(Response Headers)中添加自定义头部字段,也就是说:

add_header 是给「客户端」(如浏览器、curl、App 等)返回的响应添加 header 的。


📌 举个例子

server {
    listen 80;
    server_name example.com;

    location /api {
        proxy_pass http://backend;
        add_header X-Custom-Info "Hello from Nginx";
    }
}

当客户端请求 http://example.com/api 时,Nginx 会:

  1. 把请求转发给后端(proxy_pass);
  2. 收到后端的响应后,在返回给客户端的响应头中加上:
    X-Custom-Info: Hello from Nginx
    

你在浏览器 DevTools 或 curl -I 中就能看到这个 header。


⚠️ 重要注意事项

1. add_header 只作用于当前 locationserverhttp

  • 如果你在 server 块中定义了 add_header,但在某个 location 块中也定义了 add_header,那么 server 中的 header 会被覆盖(不会继承)!

✅ 正确做法:如果想在多个 location 中复用 header,可以使用 include 或重复写。

# ❌ 错误:/api 不会包含 X-Frame-Options
server {
    add_header X-Frame-Options "DENY";

    location /api {
        add_header X-API-Version "v1";  # 这会导致 X-Frame-Options 丢失!
        proxy_pass http://backend;
    }
}

✅ 修复方式:在 /api 中显式添加所有需要的 header:

location /api {
    add_header X-Frame-Options "DENY";
    add_header X-API-Version "v1";
    proxy_pass http://backend;
}

💡 这是 Nginx 的一个经典“坑”:子块中的 add_header 会完全覆盖父块的 add_header


2. add_header 对 4xx/5xx 错误页面也生效吗?

默认情况下,add_header 只对 2xx 和 3xx 响应生效
如果你希望在错误响应(如 404、500)中也添加 header,需要加上 always 参数:

add_header X-Content-Type-Options "nosniff" always;
  • 不加 always:只在成功响应(200、301 等)中添加;
  • always:在所有响应(包括 404、500)中都添加。

3. add_header 不影响请求头(Request Headers)

如果你想修改或添加发送给后端的请求头(比如加 X-Forwarded-For),应该用:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;

🔁 总结:

  • add_header响应头(Response)→ 给客户端
  • proxy_set_header请求头(Request)→ 给后端服务器

✅ 常见用途

场景 示例
安全加固 add_header X-Content-Type-Options "nosniff";
CORS 支持 add_header Access-Control-Allow-Origin "*";
缓存控制 add_header Cache-Control "no-store";
自定义标识 add_header X-Powered-By "MyApp";

🔧 调试技巧

curl 查看响应头是否生效:

curl -I http://your-domain.com/path

检查输出中是否包含你添加的 header。


总结

问题 答案
add_header 是给谁加的? 给客户端的 HTTP 响应头
能加到请求头上吗? ❌ 不能,要用 proxy_set_header
子 location 会继承父 header 吗? ❌ 不会,会被覆盖
能在 404 页面加 header 吗? ✅ 可以,加 always 参数

正确理解和使用 add_header,能有效提升 Web 应用的安全性、可维护性和可观测性。

posted @ 2026-03-05 10:50  龙陌  阅读(2)  评论(0)    收藏  举报