该配置用于将客户端原始协议(http/https)传递给后端,避免因反向代理导致重定向错误、secure cookie 失效等问题;需在 location 或 server 块中用 proxy_set_header x-forwarded-proto $scheme 设置,并确保后端信任该头。

这行配置的作用是把客户端最初使用的协议(http 或 https)告诉后端应用,让后端能正确生成跳转链接、判断是否启用安全 Cookie 等。
为什么需要它
当 Nginx 作为反向代理时,客户端访问的是 Nginx(比如 https://example.com),但 Nginx 转发请求给后端(如 Node.js、Django、Flask)时,默认走的是 http://127.0.0.1:3000。后端看到的原始请求协议是 http,就可能误判为非 HTTPS 环境,导致:
- 重定向链接变成
http://,触发浏览器混合内容警告或跳转失败 - Session Cookie 缺少
Secure属性,无法在 HTTPS 下发送 - OAuth 回调地址、Webhook 地址拼错协议,认证失败
怎么写才有效
必须放在 location 块或 server 块中,并配合 proxy_pass 使用。常见写法:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
location / {
proxy_pass http://backend;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
}
注意:$scheme 是 Nginx 内置变量,值为当前请求的协议(http 或 https),不是硬编码。不要写成 https 字面量,否则后端无法区分真实协议。
后端怎么用这个头
不同框架处理方式不同,但核心逻辑一致:信任 X-Forwarded-Proto,并据此设置请求协议。
-
Django:开启
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -
Express/Node.js:用
app.set('trust proxy', true),框架会自动读取X-Forwarded-Proto -
Flask:搭配
ProxyFix中间件,传入x_for=1, x_proto=1 -
Spring Boot:配置
server.forward-headers-strategy=framework,并确保 Nginx 发送了该头
安全提醒
这个头可被客户端伪造,所以只应在可信代理链中使用。Nginx 必须部署在前端(比如直接面向公网或经过云厂商负载均衡),且不能允许用户直连后端服务。如果 Nginx 前还有其他代理(如 CDN、WAF),需确认它们是否透传或覆盖了该头;必要时用 X-Forwarded-Proto 的多级格式(如 proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto)做接力。










