Nginx中需区分add_header(设响应头给客户端)和proxy_set_header(设请求头给上游),并用proxy_hide_header过滤敏感头;关键安全头应加always参数确保错误响应时仍生效。

在 Nginx 中使用 proxy_pass 转发请求时,可以通过 add_header 或 proxy_set_header 指令注入安全相关的 HTTP 响应头或请求头,从而增强后端服务的安全性。关键在于区分:哪些 Header 是发给客户端(响应头),哪些是发给上游服务(请求头),避免误用导致失效或被覆盖。
注入客户端响应安全头(如 CSP、X-Content-Type-Options)
这些 Header 由 Nginx 直接添加到返回给浏览器的响应中,用于防御 XSS、MIME 类型混淆等攻击。必须在 location 或 server 块中使用 add_header,且注意 add_header 不会继承父级块,需显式重复配置。
-
add_header X-Content-Type-Options "nosniff";阻止浏览器 MIME 类型嗅探 -
add_header X-Frame-Options "DENY";禁止页面被嵌入 iframe(也可用 CSP 替代) -
add_header X-XSS-Protection "1; mode=block";启用旧版浏览器 XSS 过滤(现代应用建议优先用 CSP) -
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https:;";严格控制资源加载来源 -
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;强制 HTTPS(always确保 4xx/5xx 响应也携带)
向后端服务透传或重写请求头(如 X-Forwarded-For、X-Real-IP)
当后端需要识别真实客户端 IP 或信任代理链时,用 proxy_set_header 设置发往 upstream 的请求头。Nginx 默认会清除部分头信息,需显式设置才能传递。
-
proxy_set_header X-Real-IP $remote_addr;传递原始客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;追加 IP 到转发链(保留原有值并添加当前代理 IP) -
proxy_set_header X-Forwarded-Proto $scheme;告知后端当前是 http 还是 https(对生成绝对 URL 很关键) -
proxy_set_header X-Forwarded-Host $host;传递原始 Host,避免后端因反向代理而获取错误域名
⚠️ 注意:proxy_set_header 设置的是**请求头(Request Header)**,只影响发给 upstream 的流量,不直接作用于客户端响应。
防止敏感头被后端意外暴露(如 Server、X-Powered-By)
后端应用可能默认输出 Server、X-Powered-By 等泄露技术栈的响应头。Nginx 可在转发响应时过滤或覆盖它们:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
proxy_hide_header X-Powered-By;完全移除该响应头(对所有 upstream 生效) -
proxy_hide_header Server;隐藏后端 Server 信息(但 Nginx 自己的Server头仍存在,需配合server_tokens off;关闭) -
proxy_set_header X-Robots-Tag "none";若需统一控制爬虫策略,可主动注入(注意这是发给后端的请求头,不是响应头)
若要彻底隐藏 Nginx 版本和名称,还需在 http 或 server 块中添加:server_tokens off;
结合安全头与代理行为的最佳实践
一个典型的安全代理配置示例:
location /api/ {
proxy_pass https://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
<pre class="brush:php;toolbar:false;"># 发给后端的可信头
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 返回给客户端的安全响应头
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 过滤后端可能泄露的头
proxy_hide_header X-Powered-By;
proxy_hide_header Server;}
确保 add_header ... always; 用于关键安全头,避免因错误响应(如 404、502)丢失防护。

















