必须设置 proxy_set_header X-Forwarded-Proto $scheme;,并配套 Host、X-Real-IP、X-Forwarded-For 等头;后端框架需显式信任该头,HTTPS to HTTPS 代理还需开启 proxy_ssl_verify 及 SNI 支持。

要让 Nginx 在反向代理时正确支持 HTTPS 连接传递,关键不是让 Nginx 自己“变成 HTTPS”,而是把客户端实际使用的协议(http 或 https)如实告诉后端服务。后端依赖这个信息生成正确的跳转链接、回调地址或安全头,否则像微信支付、OAuth 回调、Django 的 secure cookie 等都会出错。
必须设置 X-Forwarded-Proto
这是最核心的一条。Nginx 本身不自动透传协议类型,需显式用 proxy_set_header 告诉后端:
proxy_set_header X-Forwarded-Proto $scheme;-
$scheme是 Nginx 内置变量,值为http或https,由当前 server 块的listen指令决定(比如listen 443 ssl→$scheme = https) - 这条指令必须放在
location块里,且在proxy_pass之前
配套常用 Header 一起设置
单设 X-Forwarded-Proto 不够,后端通常还需真实 IP 和 Host 信息,建议一并配置:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
proxy_set_header Host $host;—— 保留原始请求 Host,避免后端误用 proxy_host -
proxy_set_header X-Real-IP $remote_addr;—— 客户端真实 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 支持多级代理链的 IP 追踪
后端框架要主动信任这个 Header
Nginx 设置了 Header,后端默认不认——必须显式启用解析逻辑:
-
Django:在 settings.py 中加
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -
Flask:用
from werkzeug.middleware.proxy_fix import ProxyFix包裹应用,如app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1) -
Express(Node.js):
app.set('trust proxy', true)即可自动识别X-Forwarded-Proto
注意 HTTPS 到 HTTPS 的上游转发
如果后端本身也走 HTTPS(比如 proxy_pass https://backend.example.com),除了透传协议,还要确保:
- 证书可信(或配置
proxy_ssl_verify off;仅限测试环境) - 必要时添加
proxy_ssl_server_name on;支持 SNI - 避免混用 HTTP/HTTPS 导致重定向循环(例如后端看到
X-Forwarded-Proto: http却强制跳 https)

















