必须配置proxy_set_header x-forwarded-proto $scheme;以透传原始协议,否则后端误判为http导致https重定向死循环;同时需补充x-real-ip、x-forwarded-for、host等头,并在后端框架中启用对应信任配置。

当 Nginx 作为反向代理时,后端服务(比如 Node.js、Django 或 Spring Boot)常需知道原始请求是 HTTP 还是 HTTPS。但默认情况下,Nginx 转发时用的是内部 HTTP 连接,Request.Scheme 或 request.scheme 往往变成 http,导致重定向出错、URL 生成异常或安全头判断失败。关键解法就是用 proxy_set_header 主动覆盖 X-Forwarded-Proto 等头部。
必须设置 X-Forwarded-Proto
这是最核心的一步。后端依赖它判断原始协议:
-
proxy_set_header X-Forwarded-Proto $scheme;—— 直接透传客户端访问 Nginx 时用的协议(http或https) - 若 Nginx 前还有 CDN 或负载均衡(如阿里云 SLB、Cloudflare),且它们已设好该头,可改用
$http_x_forwarded_proto做兜底,但需确保可信链路 - 切勿写死成
https,否则 HTTP 访问会出错
顺带补全其他关键转发头
单靠 X-Forwarded-Proto 不够,后端定位客户端 IP 和 Host 也常依赖这些头:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_set_header X-Real-IP $remote_addr;—— 传递真实客户端 IP(非 Nginx 本机 IP) -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 追加式记录 IP 链,兼容多层代理 -
proxy_set_header Host $host;或$http_host—— 保持原始 Host,避免后端因 Host 错误返回 404 或跳转异常
后端需主动读取这些头
Nginx 设置了头,后端不解析就白搭。常见框架处理方式:
- Node.js(Express):启用
app.set('trust proxy', true),自动信任X-Forwarded-Proto和X-Forwarded-For - Spring Boot:配置
server.forward-headers-strategy=framework,并确保反向代理在可信列表中 - Django:设
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),并开启USE_X_FORWARDED_HOST
验证是否生效
别只看配置,动手验证才可靠:
- 用
curl -I http://your-domain.com和curl -I https://your-domain.com分别测试,检查响应头是否一致 - 在后端加一行日志,打印
req.headers['x-forwarded-proto']或等效字段,确认值为http或https - 访问一个会重定向的接口(如未登录跳登录页),观察跳转 URL 是
http://还是https://










