proxy_pass末尾斜杠决定路径是“追加”还是“替换”:不带/则完整转发原始URI,带/则剥离location前缀;推荐location和proxy_pass均以/结尾,并设置Host、X-Real-IP等头信息。

核心就一条:proxy_pass末尾斜杠决定路径是“追加”还是“替换”。搞错它,后端收不到正确路径,404就来了。
看准 location 和 proxy_pass 末尾斜杠的组合
location匹配到的路径前缀,是否被转发给后端,全看proxy_pass结尾有没有/:
- proxy_pass 不带 /(如
http://127.0.0.1:8080)→ Nginx把整个原始URI(含location匹配部分)直接拼过去。例如请求/api/users,后端收到的就是/api/users。 - proxy_pass 带 /(如
http://127.0.0.1:8080/)→ Nginx把location匹配的前缀(如/api/)去掉,只把剩余路径发给后端。请求/api/users,后端实际收到/users。
统一用“带斜杠”的写法最稳妥
推荐始终让 location 和 proxy_pass 都以 / 结尾,形成清晰的“前缀剥离”逻辑:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
location /api/ { proxy_pass http://backend:8080/; }→ 请求/api/v1/login转发为/v1/login - 避免
location /api(无尾斜杠),它可能意外匹配/apixxx,也容易和proxy_pass的斜杠组合出歧义 - 如果后端本身有上下文路径(如
/v2/api),可直接写成proxy_pass http://backend:8080/v2/api/;,Nginx会自动替换掉/api/成/v2/api/
别让 Host 头干扰后端路由判断
默认情况下,Nginx会把 $host(客户端访问的域名)设为转发请求的 Host 头。但后端若依赖 Host 区分服务,而你 proxy_pass 写的是域名(如 api.example.com),它可能收不到预期 Host:
- 错误表现:用 IP 转发正常,换域名就 404
- 解决方法:显式设置
proxy_set_header Host $proxy_host;,确保后端看到的是 upstream 的真实域名或 IP - 额外建议:加上
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For,方便后端日志溯源
快速定位 404 是谁返回的
先别急着改配置,看两行日志就能缩小范围:
- 查
access.log:如果记录类似"GET /api/users HTTP/1.1" 404 123,且 status 是 404,说明后端返回了 404;再看后端日志是否真收到了该路径 - 查
error.log:如果出现no resolver defined、no upstream或open() "/xxx" failed,说明 Nginx 自身没配好 upstream 或找不到 location,404 来自 Nginx 层

















