Nginx反向代理需规范proxy_pass写法:末尾斜杠决定路径是否剥离,HTTPS后端必须显式写https://,优先用域名而非IP且禁用变量拼接,后端应集中定义于upstream块,并标准化透传Host、X-Real-IP、X-Forwarded-Proto等关键header。

proxy_pass 末尾斜杠必须严格匹配语义
斜杠不是风格问题,是路径拼接规则开关:
- location /api/ { proxy_pass http://127.0.0.1:8080/; } → 请求 /api/user 转发为 http://127.0.0.1:8080/user(剥离
/api/) - location /api/ { proxy_pass http://127.0.0.1:8080; } → 请求 /api/user 转发为 http://127.0.0.1:8080/api/user(保留完整 URI)
- 统一建议:后端服务根路径即 API 入口时(如 Spring Boot 默认无前缀),location 和 proxy_pass 都带尾部斜杠;后端已自带统一前缀(如 /v1/),则 proxy_pass 不加斜杠,避免重复嵌套
HTTPS 后端必须显式写 https:// 协议头
Nginx 默认以 HTTP 连接上游,不自动识别后端是否启用了 HTTPS:
- ✅ 正确:
proxy_pass https://api.example.com;—— 显式启用 TLS 握手 - ❌ 错误:
proxy_pass http://api.example.com;—— 会尝试用 HTTP 连接 HTTPS 端口,连接立即失败 - 若用 IP 地址(如
https://10.0.1.5),需确保后端证书的 Subject Alternative Name(SAN)包含该 IP,否则proxy_ssl_verify on将拒绝连接
域名优先,IP 次之;禁止混用变量或动态拼接
后端地址应稳定、可解析、易审计:
- ✅ 推荐:
proxy_pass http://backend-api:8080/;(配合 DNS 或 /etc/hosts,便于服务发现与切换) - ⚠️ 可接受:
proxy_pass http://192.168.1.100:8080/;(仅限内网固定 IP 场景) - ❌ 禁止:
proxy_pass http://$upstream_host:$upstream_port/;(Nginx 不缓存含变量的 proxy_pass,性能下降且无法做健康检查) - 所有后端地址应在 upstream 块中集中定义,例如:
upstream backend_api {
server backend-api:8080 max_fails=3 fail_timeout=30s;
}
再在 location 中引用proxy_pass http://backend_api/;
配套 header 必须标准化透传
后端依赖这些头判断真实请求上下文,缺失会导致鉴权失败、日志失真、重定向异常:
- 强制设置:
proxy_set_header Host $host;(避免后端因 Host 缺失路由错误) - 必传客户端标识:
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For $proxy_add_x_forwarded_for; - 协议一致性:
proxy_set_header X-Forwarded-Proto $scheme;(让后端知道原始是 HTTP 还是 HTTPS) - 不建议覆盖
Host为后端域名(如$upstream_host),除非后端明确要求且做了多租户隔离


















