必须显式配置proxy_set_header X-Forwarded-Proto $scheme,否则后端无法识别真实协议,导致重定向错误、混合内容警告或安全Cookie失效;还需同步设置X-Forwarded-For、X-Forwarded-Host和X-Forwarded-Port等头,并确保后端信任代理头。

在 Nginx 反向代理场景中,后端服务(如 Node.js、Python Flask、Spring Boot)常需感知客户端真实请求协议(http 或 https),尤其涉及重定向、生成绝对 URL、安全头判断等逻辑。若不显式透传,后端通常只能拿到 http(因 Nginx 与后端之间默认走 HTTP),导致跳转出错、混合内容警告或鉴权失败。关键在于正确使用 proxy_set_header 设置 X-Forwarded-Proto。
为什么要设置 X-Forwarded-Proto
该 Header 是事实标准,用于告知上游服务“客户端最初是用什么协议发起请求的”。Nginx 本身不会自动携带它;即使启用了 HTTPS 入口,转发给后端时仍默认使用 HTTP 协议,$scheme 变量值为 http。后端依赖此 Header 决定是否强制跳转 HTTPS、拼接链接时用 https:// 还是 http://。
基础配置写法
在 location 或 server 块中添加:
proxy_set_header X-Forwarded-Proto $scheme;
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
其中 $scheme 是 Nginx 内置变量,值为当前请求的协议(http 或 https)。这是最直接、最可靠的方式。不要硬编码为 https,否则 HTTP 请求也会被误标。
配合其他常用透传 Header
实际部署中建议一并设置以下 Header,形成完整信任链:
-
proxy_set_header X-Forwarded-For $remote_addr; —— 传递原始客户端 IP(注意:若有多层代理,应改用
$proxy_add_x_forwarded_for避免覆盖) - proxy_set_header X-Forwarded-Host $host; —— 保留原始 Host,便于后端识别虚拟主机或生成正确域名
- proxy_set_header X-Forwarded-Port $server_port; —— 显式传递入口端口(如 443),辅助后端判断协议与端口对应关系
注意事项与常见误区
避免在 http 块顶层重复定义 proxy_set_header,可能导致被子块继承覆盖;建议统一放在 location 中。同时确认后端应用已启用对 X-Forwarded-* 的信任(例如 Spring Boot 需配 server.forward-headers-strategy=framework,Express 需 app.set('trust proxy', true))。若 Nginx 前还有 CDN 或负载均衡器,需确保它们也正确设置了 X-Forwarded-Proto,否则 Nginx 收到的 $scheme 可能仍是 http。

















