安全配置Nginx反向代理需对齐location与proxy_pass末尾斜杠以正确透传路径,设置Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto等头信息保留客户端真实信息,避免无效嵌套而用独立location匹配,WebSocket需启用HTTP/1.1及Upgrade头。

在 location 块中安全地配置反向代理,核心是控制路径透传逻辑、保留客户端真实信息、避免头信息丢失或覆盖,并防止因末尾斜杠处理不当引发的 404 或重定向异常。关键不在“能不能嵌套”,而在于“怎么写才不踩坑”。
路径匹配与 proxy_pass 末尾斜杠必须对齐
location 路径前缀和 proxy_pass 目标地址的结尾斜杠共同决定路径如何拼接,这是最容易出错的地方:
- location /api/ + proxy_pass http://127.0.0.1:3000/:/api/users → 转发为 /users(前缀 /api/ 被剥离)
- location /api/ + proxy_pass http://127.0.0.1:3000(无尾斜杠):/api/users → 转发为 /api/users(完整路径透传)
- location /admin + proxy_pass http://127.0.0.1:5000/:/admin → /,/admin/xxx → /xxx;但 /adminxxx 也会被匹配(前缀匹配),建议用 location ^~ /admin/ 更精准
必须设置的关键请求头
不加这些头,后端常拿不到真实 IP、原始 Host 或协议类型,日志、鉴权、跳转都可能出错:
- proxy_set_header Host $host:把客户端请求的 Host 值传过去,避免后端因 Host 不匹配拒绝请求
- proxy_set_header X-Real-IP $remote_addr:提供最外层真实客户端 IP
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:支持多级代理时追加 IP 链
- proxy_set_header X-Forwarded-Proto $scheme:让后端知道用户是用 http 还是 https 访问的,对生成绝对 URL 很关键
避免 location 嵌套引发的继承冲突
Nginx 的 location 不支持传统意义的“嵌套块继承”,看似嵌套实为独立匹配。常见误写:
错误示范(无效嵌套):
location /v1/ {
proxy_pass http://backend1/;
location /v1/auth { # 这个不会生效!Nginx 不按缩进解析嵌套
proxy_pass http://auth-svc/;
}
}
正确做法:用独立、明确的前缀或正则 location 并列声明
- location ^~ /v1/auth/:优先前缀匹配,比普通 /v1/ 更高权重
- location ~ ^/v1/[a-z]+/\d+$:正则匹配特定格式 ID 请求
- 所有 location 必须在同一个 server 块内平级书写,靠匹配规则优先级区分
WebSocket 和长连接需额外启用
如果后端是 WebSocket 服务(如 /ws/),默认 HTTP 代理会断开升级请求:
- 添加 proxy_http_version 1.1 和 proxy_set_header Upgrade $http_upgrade
- 加上 proxy_set_header Connection "upgrade",否则 101 Switching Protocols 失败
- 示例:
location /ws/ {<br> proxy_pass http://127.0.0.1:8081/;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";<br> proxy_set_header Host $host;<br> }











