关键在于精准透传真实ip、原始协议端口及host三类字段:x-real-ip设$remote_addr,x-forwarded-for用$proxy_add_x_forwarded_for;host用$http_host,x-forwarded-proto设$scheme,x-forwarded-port设$server_port;后端需主动解析这些头。

要让后端在处理静态资源(如 CSS、JS、图片)时仍能准确识别真实客户端信息,关键不是“转发所有头”,而是精准透传三类必要字段:真实 IP、原始访问协议与端口、以及用户请求的 Host。Nginx 默认会覆盖或丢弃这些信息,必须通过 proxy_set_header 显式声明。
透传真实客户端 IP(X-Real-IP 与 X-Forwarded-For)
静态资源路径虽由前端生成,但某些场景(如 CDN 回源鉴权、按地域加载资源、日志统计)需后端知晓真实访问者 IP:
-
X-Real-IP:设为
$remote_addr,简洁明确,适合单层代理或已用real_ip_module解析后的可信环境 -
X-Forwarded-For:务必用
$proxy_add_x_forwarded_for,而非$remote_addr—— 它会保留上游已有的链路(如 CDN → Nginx),并在末尾追加当前层的真实 IP,避免覆盖原始用户 IP - 若 Nginx 前有 CDN,需配合
set_real_ip_from和real_ip_header X-Forwarded-For,确保$remote_addr本身已是用户真实 IP,后续透传才可靠
保持原始协议、端口与 Host(修复资源 URL 错误)
静态资源加载失败(如 404 或混用 HTTP/HTTPS)常因后端生成的绝对路径用了错误端口(如写成 http://example.com:80 而非实际访问的 :9000):
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
Host:用
$http_host(而非$host),它完整保留请求头中的 Host 字段,含端口(如api.example.com:2026) -
X-Forwarded-Proto:设为
$scheme,让后端知道是 http 还是 https,避免强制跳转或生成不安全链接 -
X-Forwarded-Port:显式设为
$server_port(Nginx 监听端口),这是修复静态资源路径的核心——后端框架(如 Spring Boot、Express)依赖该头拼接正确 baseURL
避免干扰静态资源响应的关键设置
某些头若处理不当,会导致缓存失效、CORS 失败或 WebSocket 中断:
-
Connection 与 Upgrade:若静态资源服务支持 HTTP/2 或需升级协议(如某些前端 dev server),添加
proxy_set_header Connection $http_connection;和proxy_set_header Upgrade $http_upgrade; -
禁用 proxy_redirect:设为
proxy_redirect off;或留空,防止 Nginx 自动重写后端返回的Location响应头,把端口强制改成 80 或 443 - 不转发敏感头:如
Authorization、Cookie等,除非静态资源服务明确需要认证,否则应避免透传,减少安全风险
后端必须主动读取,Nginx 不会自动“生效”
Nginx 只负责把头字段发出去,后端代码或框架需显式解析才能起作用:
- Spring Boot:启用
server.forward-headers-strategy=framework,并确认server.forward-headers-strategy已生效 - Express(Node.js):设置
app.set('trust proxy', true),再通过req.get('X-Real-IP')或req.protocol + '://' + req.get('X-Forwarded-Host') + ':' + req.get('X-Forwarded-Port')构建资源前缀 - PHP:读
$_SERVER['HTTP_X_REAL_IP']或$_SERVER['HTTP_X_FORWARDED_PORT'],注意X-Forwarded-For是逗号分隔字符串,取第一个值










