proxy_pass末尾是否带斜杠决定路径拼接方式:带/则剥离location前缀后转发(如/api/user→/user),不带/则完整转发原始路径(如/api/user→/api/user);必须设置host、x-real-ip、x-forwarded-for、x-forwarded-proto等请求头以透传真实客户端信息。

匹配成功后,Nginx 通过 proxy_pass 指令把请求发给后端,但不是简单“一转了事”——路径怎么拼、头信息怎么传、协议怎么保持,都得手动配清楚,否则后端很可能收不到正确路径或真实客户端信息。
proxy_pass 决定路径怎么拼
location 匹配只是第一步,真正影响后端收到什么 URL 的,是 proxy_pass 后面有没有结尾斜杠(/):
-
带尾部 /:如
location /api/ { proxy_pass http://127.0.0.1:3000/; }→ 访问/api/user,后端收到的是/user -
不带尾部 /:如
location /api { proxy_pass http://127.0.0.1:3000; }→ 访问/api/user,后端收到的是/api/user
多数前后端分离场景推荐第一种写法,避免后端路由多一层 /api 前缀。
必须补全关键请求头
默认情况下,Nginx 会把 Host 设成后端地址(比如 127.0.0.1:3000),后端可能直接拒掉请求。所以要显式设置:
-
proxy_set_header Host $host;—— 传浏览器实际访问的域名(如example.com) -
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
其他常见转发需求补充
有些场景需要额外配置才能正常工作:
-
WebSocket:需加
proxy_http_version 1.1;、proxy_set_header Upgrade $http_upgrade;、proxy_set_header Connection "upgrade"; -
大文件上传:在 location 块里加
client_max_body_size 100m;,不然 Nginx 默认只允许 1MB -
超时控制:加上
proxy_connect_timeout 30s;、proxy_send_timeout 300s;、proxy_read_timeout 300s;,防止长连接卡死
别忘了检查匹配优先级
多个 location 共存时,Nginx 不是按配置顺序执行,而是按规则优先级选中一个:
-
= /(精确匹配)最高优先 -
^~ /static/(前缀匹配且终止正则检查)次之 -
/api/(普通前缀匹配)取最长匹配 -
~ \.js$(正则匹配)最后检查,且按配置顺序
如果 /api/user 总是被某个正则 location 错误捕获,就要检查是否该用 ^~ 提前锁定,或调整书写顺序。











