Nginx可通过SSL终止实现HTTPS前端与HTTP后端通信:配置443端口HTTPS服务,用proxy_pass转发至HTTP后端,并设置Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto等代理头,后端需信任并解析X-Forwarded-Proto以正确处理重定向和安全策略。

当后端服务只支持 HTTP,而前端需要通过 HTTPS 访问时,Nginx 可以作为反向代理,在 SSL 终止(SSL Termination)后,将解密的请求以 HTTP 协议转发给后端。这是常见且安全的做法,关键在于正确配置 proxy_pass 与相关代理头。
确保 Nginx 正确终止 HTTPS
先确认你的 server 块已启用 HTTPS,并配置了有效的证书:
server {
listen 443 ssl;
server_name example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 其他 SSL 安全配置(可选)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:...;}
使用 proxy_pass 转发到 HTTP 后端
在 location 块中用 proxy_pass 指向后端 HTTP 地址(如 http://127.0.0.1:8080),注意末尾斜杠一致性:
- 若
location /api/ { proxy_pass http://backend/; },则/api/user→ 后端接收为/user - 若写成
proxy_pass http://backend;(无结尾斜杠),则路径原样传递,可能引发 404
必须设置的代理头字段
后端应用常依赖 X-Forwarded-* 头判断原始协议、IP 和 Host。缺失会导致重定向错误(如 HTTP 跳转 HTTPS)、日志 IP 为 127.0.0.1、或生成错误链接:
-
proxy_set_header Host $host;—— 保持原始 Host -
proxy_set_header X-Real-IP $remote_addr;—— 真实客户端 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;-
proxy_set_header X-Forwarded-Proto $scheme;—— 关键!让后端知道原始是 HTTPS
后端需适配 X-Forwarded-Proto
仅 Nginx 设置不够,后端框架必须信任并读取该头:
- Spring Boot:设
server.forward-headers-strategy=framework或native - Express.js:启用
app.set('trust proxy', true) - Django:配置
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - 否则重定向、CSRF token、绝对 URL 构建仍会出错










