proxy_pass末尾斜杠是路径处理行为开关:带/则替换location前缀,不带/则原样转发;带路径不加/会导致路径粘连,加/才安全重写。
proxy_pass 末尾加不加斜杠,本质是告诉 Nginx:要不要把 location 匹配到的前缀路径“砍掉”,再拼接剩余路径。这个开关一开一关,后端收到的 URI 就完全不同,直接决定接口能不能通。
它表示“用这个 / 替换掉 location 匹配的部分”。Nginx 会把请求中匹配到的前缀(比如 /api/)整个去掉,只把剩下的路径贴到目标地址后面。
location /api/ { proxy_pass http://127.0.0.1:3000/; }
/api/users → 后端收到 /users
/api/v2/login → 后端收到 /v2/login
它表示“原样转发”,Nginx 不做任何路径修改,把整个原始请求 URI 直接拼过去。
location /api/ { proxy_pass http://127.0.0.1:3000; }
/api/users → 后端收到 /api/users
/api/v2/login → 后端收到 /api/v2/login
这是高危写法:Nginx 会把 location 匹配部分替换成 /v1,但不自动加分隔符,导致路径粘连。
location /api/ { proxy_pass http://127.0.0.1:3000/v1; }
/api/users → 后端收到 /v1users(不是 /v1/users!)http://127.0.0.1:3000/v1/
这是最清晰可控的方式:Nginx 把 location 前缀替换成 /v1/,再干净拼上剩余路径。
location /api/ { proxy_pass http://127.0.0.1:3000/v1/; }
/api/users → 后端收到 /v1/users
/api/v2/login → 后端收到 /v1/v2/login
实际调试时,可配合 curl -v 查看后端真实接收路径,或开启 Nginx error_log debug 观察 rewrite 过程。记住:斜杠不是格式习惯,而是行为开关——写错一个字符,后端就收不到正确路径。