Nginx反向代理中需强制添加X-Frame-Options、X-XSS-Protection、X-Content-Type-Options、Strict-Transport-Security等安全响应头并用always参数覆盖所有状态码,同时隐藏Server/X-Powered-By头、规范CSP、校验真实IP、拦截非法Host及危险传输头。

在 Nginx 反向代理场景中配置安全响应头,核心目标是让后端应用发出的响应,在经过 Nginx 时被增强或修正,确保浏览器收到的是符合现代安全规范的头部。Nginx 本身不生成业务响应,但它可以统一注入、覆盖或清除响应头——这是防御 XSS、点击劫持、MIME 嗅探等攻击最直接有效的手段。
强制添加关键安全响应头
在 location 或 server 块中使用 add_header 指令,为所有经由该路径返回的响应注入防护头。注意:默认情况下,add_header 在子请求(如内部重定向)中不继承,需加 always 参数才能作用于所有响应状态码(包括 301、403、500 等):
-
add_header X-Frame-Options "DENY" always;—— 完全禁止页面被嵌入 iframe,防点击劫持 -
add_header X-XSS-Protection "1; mode=block" always;—— 启用浏览器内置 XSS 过滤器(虽现代浏览器逐步弃用,但对旧版本仍有价值) -
add_header X-Content-Type-Options "nosniff" always;—— 阻止浏览器根据响应内容“猜测” MIME 类型,防恶意脚本伪装成图片或 CSS 执行 -
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;—— 强制后续访问走 HTTPS,防中间人降级(仅在启用 HTTPS 的 server 块中配置)
清除或覆盖后端不安全的响应头
后端应用可能输出危险头(如 X-Powered-By: PHP/8.2)、错误的 Server 信息,或重复设置冲突的 Content-Security-Policy。Nginx 可在代理响应阶段统一清理:
- 隐藏服务器指纹:
proxy_hide_header Server;和proxy_hide_header X-Powered-By; - 若需自定义 Server 头(需安装
headers-more-nginx-module):more_clear_headers "Server"; more_set_headers "Server: Web-Proxy"; - 覆盖后端 CSP(避免宽松策略被继承):
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https:; object-src 'none'; base-uri 'self'; frame-ancestors 'none';" always;
配合 realip 模块确保 IP 类头部可信
反向代理下,$remote_addr 是真实客户端 IP,但 X-Forwarded-For 等头可被伪造。若响应中需动态生成策略(如基于 IP 的限流日志),必须先校验上游来源:
- 在
http块中声明可信代理:set_real_ip_from 10.0.0.0/8; set_real_ip_from 192.168.0.0/16; - 启用解析:
real_ip_header X-Forwarded-For; real_ip_recursive on; - 此后所有日志、限流、条件判断都应基于
$remote_addr(已被修正),而非原始$http_x_forwarded_for
拦截非法 Host 头与头部冲突请求
Host 头攻击和头部走私常发生在反向代理环节。Nginx 应在请求进入后端前就切断异常流量:
- 设默认 server 拦截非法 Host:
server { listen 80 default_server; server_name _; return 444; } - 业务 server 显式列出合法域名:
server_name example.com www.example.com; - 防御头部走私:禁用可疑编码传输头,防止缓存投毒或请求拆分:
if ($http_transfer_encoding ~* "chunked|identity") { return 400; } if ($http_content_length !~ "^[0-9]+$") { return 400; } proxy_set_header Transfer-Encoding "";


















