404 排查最先要弄清的不是“哪里错了”,而是“这个 404 是谁返回的”。同一句 Not Found,可能来自 Nginx 的静态文件找不到、反向代理把路径前缀吞掉、应用路由没注册、CDN 缓存了一条旧的 404,也可能只是浏览器请求的 URL 与你实际部署的路径差了大小写或一个尾斜杠。先跑一条命令拿到状态码和响应头,再决定去看日志还是看配置,比直接改 nginx.conf 更省时间。
先用 curl -I 拿到状态码和 Server 头,再回 /var/log/nginx/access.log 里确认这条请求有没有落到源站。日志里没有该请求,问题在 DNS、CDN 缓存或回源配置;日志里有请求,重点看 $request 中的路径、大小写、尾斜杠和 try_files 命中情况。改配置前先备份,并在预发或灰度环境确认效果。
404错误怎么排查原因呢苹果
在 iPhone、iPad 或 Mac 上看到 404,多数不是 Safari 特有的问题,而是请求的 URL 和部署路径对不上:中文文件名未编码、大小写不一致、相对路径基于 App 内 WebView 的 baseURL 解析错。确认位置有两处:一是 Mac 上 Safari 菜单栏“开发”>“显示网页检查器”>“网络”标签,找到红字 404 那条,看完整 Request URL;iOS 真机需在“设置 > Safari > 高级”打开网页检查器,再用 Mac 的 Safari 远程检查。二是服务器 access.log 里按 UA 过滤,看这条 URL 是否原样到达:
curl -I -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15" https://example.com/path/
grep 'iPhone' /var/log/nginx/access.log | grep ' 404 ' | tail -n 20
如果检查器里的 URL 带尾斜杠而服务端目录没有 index,或者中文路径在日志里变成了 %E4%B8%AD 形式,就能确定是哪一步出的问题,不用再去猜机型或系统版本。

404错误怎么排查原因呢视频
视频类 404 通常出现在分片请求上:m3u8 能打开,但其中的 ts 分片 404,或者 mp4 播到中途断掉。这类请求带 Range 头和 Referer,排查时要模拟同样的请求头,否则你在浏览器地址栏直接打开是正常的,一放进播放器就 404。可核对的位置有三个:浏览器开发者工具网络面板中 .m3u8/.ts 请求的完整 URL;access.log 里对应分片的请求行;CDN 或对象存储控制台中该对象 Key 和防盗链配置。用下面这条命令复现:
curl -I -H "Referer: https://example.com/" -H "Range: bytes=0-1023" https://cdn.example.com/video/demo.mp4
如果加 Referer 后返回 200、不加返回 404,说明是防盗链或私有读策略拦的;有些 CDN 会用 404 代替 403,别只看状态码。如果是 ts 分片 404,去对象存储控制台确认分片是否真的上传完整,特别是切片任务中断时只留了 m3u8 而没有后续分片。
404错误先定位在哪一层
按请求经过的顺序分层判断,能避免在错误的层反复改:

- 浏览器层:开发者工具网络面板看 Request URL 和 Response Headers,判断请求是否发对了地址。
- 边缘层:CDN 控制台的缓存状态和回源状态码字段,判断是缓存命中返回 404 还是回源就是 404。
- 反向代理层:/var/log/nginx/access.log 是否有该请求、error.log 有无 rewrite 或 open() failed 记录。
- 应用层:框架路由表、伪静态规则是否包含该路径,检查应用自身日志。
- 文件层:ls 目标路径,确认文件存在、权限可读、软链接未断。
判断依据很简单:日志里没有这条请求,问题在边缘层之前;日志里有请求且路径正确,问题在文件层;日志里路径被改写或缺少前缀,问题在代理或重写规则。
404错误:先看这四个位置
- 日志:
tail -f /var/log/nginx/access.log看请求行与状态码,tail -n 100 /var/log/nginx/error.log看具体失败原因;按路径统计可执行awk '$9==404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head。 - 命令输出:
curl -I -v https://你的域名/路径,重点看响应头 Server、Location、Cache-Status 和最终状态码。 - 配置项:
nginx -T输出全部生效配置,检查对应 location 的 root/alias、try_files、proxy_pass 是否带尾斜杠,改完先nginx -t再 reload。 - 面板字段:CDN 控制台的缓存键、缓存状态、回源状态码,对象存储的对象 Key 与读写权限,面板显示的路径要和浏览器请求路径逐字符对齐。
404错误:按可能性从高到低排除
- 路径不一致:大小写、尾斜杠、多余子目录。确认动作:把 access.log 的 $request 与磁盘实际路径并排比对。
- 文件不存在或没部署上去:确认动作:
ls -l /data/www/路径,看发布流水线是否漏传。 - 重写规则未命中:确认动作:在 location 中加入临时 return 200 测试规则是否生效,验证后立即撤回。
- 代理丢失前缀:确认动作:看 proxy_pass 结尾是否带斜杠,带斜杠会截掉 location 前缀,去掉后对比一次。
- 应用路由未注册:确认动作:直接请求应用端口
curl -I http://127.0.0.1:8080/路径,绕过代理看是否仍 404。 - CDN 缓存了旧的 404:确认动作:在控制台对该 URL 做刷新,并核对回源状态码是否已变为 200。
- 权限或软链接问题:确认动作:error.log 中若出现 Permission denied 或 open() 失败,按该路径修权限。
一个容易踩的坑:给 alias 配 try_files。alias 会把 location 前缀替换成目录路径,和 try_files 组合时拼接结果常与预期不一致,表现为明明文件在却一直 404。这类场景建议改用 root 加完整目录结构,或者先用 nginx -T 确认最终生效的路径拼接规则再改。