Nginx反向代理中需用proxy_hide_header删除响应头、add_header添加安全头、proxy_redirect重写Location/Refresh、proxy_cookie_path/domain修正Cookie属性,各指令作用域与顺序至关重要。

Nginx 作为反向代理时,默认会将上游服务器返回的响应头原样透传给客户端,但实际场景中常需修改或删除某些响应头(如 Server、X-Powered-By、Set-Cookie 的域名/路径、Location 重定向地址等)。这些操作需通过 Nginx 的内置指令精确控制,不能依赖 rewrite 或 proxy_set_header 等易混淆的配置。
使用 proxy_hide_header 删除特定响应头
该指令用于完全移除上游响应中不希望暴露给客户端的 HTTP 响应头。它只在当前 location 或 server 块中生效,且必须写在 proxy_pass 之后才有效。
-
常见用途:隐藏后端技术标识,如
X-Powered-By: PHP/8.1、Server: Apache -
注意点:Nginx 默认已隐藏
Date、Server、X-Accel-...等头;若要显示被默认隐藏的Server,需配合server_tokens off;和proxy_hide_header的反向操作(即不隐藏) -
示例配置:
location /api/ { proxy_pass https://backend; proxy_hide_header X-Powered-By; proxy_hide_header X-AspNet-Version; }
使用 proxy_set_header 修改或覆盖响应头(仅限部分头)
严格来说,proxy_set_header 只作用于请求头(发往 upstream),不能直接改响应头。真正用于设置/覆盖响应头的是 add_header 指令,但它只能添加新头或覆盖自身生成的头,无法修改 upstream 原始响应头内容。
-
正确做法:先用
proxy_hide_header删除原始头,再用add_header添加新值 -
适用场景:统一设置
X-Content-Type-Options: nosniff、Strict-Transport-Security等安全头 -
限制说明:add_header 不继承父块,且对 301/302 的
Location头无效——这类头需用proxy_redirect
重写重定向地址:proxy_redirect 处理 Location 和 Refresh 头
当上游返回 301/302 并带 Location: http://internal:8080/path 时,客户端无法访问内网地址。此时需用 proxy_redirect 重写响应头中的 URL。
-
基本语法:
proxy_redirect http://internal:8080/ https://example.com/; -
支持正则:
proxy_redirect ~^http://old\.example\.com(/.*)$ https://new.example.com$1; -
关闭重写:
proxy_redirect off;(慎用,可能导致跳转失败) -
注意:该指令只处理
Location和Refresh响应头,不影响其他头
精细控制 Set-Cookie:proxy_cookie_path 与 proxy_cookie_domain
上游返回的 Set-Cookie 头常含 Path=/app 或 Domain=backend.local,导致浏览器拒绝携带 Cookie。Nginx 提供专用指令修正:
-
proxy_cookie_path /app /;—— 将 cookie 路径从/app改为根路径 -
proxy_cookie_domain backend.local example.com;—— 将 domain 值由内网域名替换为公网域名 -
通配符支持:
proxy_cookie_domain ~\.local$ ".example.com";(注意引号和正则语法) -
清除 Domain 属性:设为空字符串
proxy_cookie_domain "" "";,使浏览器按当前请求域名自动设置
不复杂但容易忽略:所有 header 修改类指令都依赖执行顺序和作用域。删、改、加需分步明确,不能指望一条指令完成全部动作。










