Nginx 反向代理出现404时,先确认请求命中了哪个 server 和 location,再对照后端实际收到的路径。普通前缀 location 中,proxy_pass 是否包含 URI 会改变路径映射:末尾的斜杠可能代表用“/”替换匹配前缀,不能仅凭加斜杠或删斜杠猜测修复。

适用版本与前提

本文依据2026年11月4日查阅的 Nginx 官方文档,面向 Linux 上 Nginx 1.9.2及以上的 HTTP 反向代理,使用普通前缀 location、固定上游地址、不含 rewrite 的简化场景。本文为资料整理,示例未在目标环境实测;OpenResty、容器及面板配置应先确认实际二进制和加载文件。

准备一个可安全重复访问的只读请求,记录域名、方法、完整路径、查询参数、响应状态和时间,并获得对应 Nginx 与后端日志的读取权限。不要用可能创建订单或修改数据的接口做探测。本文只讨论路径定位,不覆盖身份认证、缓存及完整生产代理配置。

第一步:排除请求走错虚拟主机或 location

同一地址可承载多个站点。直接用 IP 访问与用真实域名访问,可能落到不同 server。先核对监听地址、端口及 Host,见Nginx 请求处理说明。HTTPS 场景还应沿用真实域名进行验证,避免把另一个站点的404当成本次代理故障。

普通前缀匹配会记住最长前缀,但正则 location 仍可能取得处理权;精确匹配和 ^~ 又有各自规则。不要看到配置里有 /api/ 就认定它必然生效,应一起检查同级及嵌套规则。规则以官方 location 文档为准;本文不使用新版本才有的其他匹配形式。

第二步:把两种路径映射写清楚

以下两段是同一个 server 中的二选一示意,不要同时粘贴。假设请求为 /api/users?id=1,上游地址是部署示例,必须替换成自己的服务。

后端路由本身包含 /api/

location /api/ {
    proxy_pass http://127.0.0.1:8080;
}

这里 proxy_pass 仅有协议、地址和端口,没有 URI;在本文无改写的条件下,上游收到 /api/users?id=1。

后端路由从 /users 开始

location /api/ {
    proxy_pass http://127.0.0.1:8080/;
}

这里地址后的“/”是 URI,匹配的 /api/ 前缀会被它替换,上游路径为 /users?id=1。两者没有通用的优劣,要按后端路由选。映射规则见官方 proxy_pass 说明。

上述结论不直接套用于变量 proxy_pass、正则或命名 location,以及 rewrite ... break 改写请求的情况;这些都有专门规则,应回到同一份官方 URI 传递说明逐项确认。也不要把特殊编码、重复斜杠请求与普通路径视为完全等价。

第三步:用日志确认404来自哪一层

  1. 用真实域名发送预先选定的只读请求,保留时间、状态和响应内容。
  2. 在前端访问日志中查同一请求,再核对后端日志收到的方法与路径。页面长得像 Nginx 默认错误页不足以确定错误来源。
  3. 如果现有日志已记录 upstream_addr、upstream_status,可据此缩小范围:上游地址表示尝试连接的目标,upstream_status 记录上游返回的状态;有重试或内部跳转时可能出现多个值,应结合整条请求分析。
  4. 若后端收到 /users 而路由要求 /api/users,或相反,才有路径映射不匹配的直接证据。即使路径一致,后端仍可能因租户、Host、登录状态或业务资源不存在返回404。

上游变量定义见官方上游变量文档。日志中没有上游信息并不自动证明请求没到后端;先检查当前日志格式、采样及实际写入位置,不要用缺失字段作唯一结论。

第四步:小范围修改并验证

备份本次涉及的配置,确认运行实例的路径和启动参数。下面仅适用于当前 nginx 命令对应线上实例且使用默认配置的情况;自定义 -c、-p 参数必须在每次检查中保持一致。

nginx -v
sudo nginx -T
sudo nginx -t

-v 显示版本,-T 检查并输出配置以便核对 include 内容,-t 检查语法并尝试打开引用文件。-T 自1.9.2提供,输出可能含敏感配置,应仅在授权终端查看并妥善保存。参数含义见官方命令行参数。语法通过无法证明后端业务路径正确。

一次只调整已确认错误的映射,检查通过后按既有方式重载,再重复同一请求及相邻正常路径,核对后端实际路径、状态、内容和跳转。重载与回退步骤可参考本站Nginx 配置检查与安全重载方法。若验证变差,恢复本次备份并再次检查、重载、验证。

常见问题与边界

为什么 /api 与 /api/ 的结果不同?

以斜杠结尾且由代理处理的前缀 location,对不带末尾斜杠的对应请求可能产生自动301。测试时先记录第一跳状态和 Location,不要直接跟随跳转后只看最终页面;该行为及精确匹配的处理方式见location 官方说明。

改完斜杠仍然404怎么办?

回到实际命中的规则和后端请求日志。路径映射只是一个假设;只有输入、匹配规则、上游路径与响应对应起来,才能确认修复。保留版本、配置差异、请求时间和验证结果,便于继续排查,不能把未执行的示例当作实测结论。