应通过awk '$9 == 404 {print}' access.log精准筛选真实404请求,重点分析第7列(URI)、第1列(客户端IP)和第11列(Referer),结合响应字节数小、高频路径及Referer关联性定位资源缺失或引用错误。

怎么看 access.log 里的真实 404 请求
404 日志不是浏览器弹窗,而是服务器在 access.log 里记下“这次请求我真没找到”。关键不是找“404”字样,而是找状态码为 404 且响应字节数很小的行——这类请求通常只返回错误页 HTML 或空体。
用 grep " 404 " access.log(注意前后空格)能筛出大部分,但更准的是:awk '$9 == 404 {print}' access.log。每行字段顺序取决于日志格式,常见 Apache/Nginx 默认是第 9 列为状态码。
- 重点看
$7(请求路径):比如/css/main.css或/user/profile,它告诉你哪个 URL 没命中 - 别忽略
$1(客户端 IP):同一 IP 短时高频 404,可能是前端路由刷屏或爬虫扫错路径 - 对比
$11(Referer):如果大量/js/app.js的 404 都来自/admin/index.html,说明这个 HTML 里引用路径写错了
为什么 curl -I 看到 404 却 log 里没有
日志只记录被服务器真正处理过的请求。以下情况不会进 access.log:
- 浏览器直接读
file://协议文件——根本没走 HTTP 服务,压根不产生日志 - Nginx/Apache 在
server块外就拒绝了请求(如非法 Host 头、超大 body),可能只进error.log - CDN 或反向代理(如 Cloudflare)提前拦截并返回 404,源站日志完全空白
- 前端 history 模式下,
/about刷新触发请求,但 Nginx 配了try_files $uri $uri/ /index.html;,该请求被重写后最终返回 200,log 里看不到 404
所以看到 curl -I 返回 404,先确认你查的是**源站日志**,且请求确实穿透到了这层。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
如何从日志快速定位 HTML 引用错误
HTML 页面本身 404 很少见(除非部署漏文件),多数是它引用的资源报 404。日志里高频出现的路径,往往暴露 HTML 中的硬编码问题:
-
/assets/css/style.css404 → 检查 HTML 中<link href="/assets/css/style.css">是否与构建输出目录一致 -
/IMG/logo.png404 → 注意大小写:Linux 服务器上IMG≠img,而 Windows 开发时可能不报错 -
/pages/about.html404 且 Referer 是/→ 可能是导航菜单写死href="pages/about.html",但页面实际放在/about.html - 大量
/api/user404 且 Referer 是前端单页 → 后端没开 CORS 或路由前缀冲突,不是 HTML 问题,但日志里会混在一起
用 awk '$9 == 404 {print $7}' access.log | sort | uniq -c | sort -nr | head -10 快速找出 Top 10 错误路径,比人眼扫快得多。
日志里看到 404 但页面明明能打开?
最常见原因是服务器配置了自定义 404 页面,但没设对状态码——返回的是 200 OK,内容却是“404 Not Found”。搜索引擎和用户都以为页面正常,实际是假 404。
验证方法只有两个:curl -I http://yoursite.com/nonexistent 看第一行是否为 HTTP/1.1 404 Not Found;或者在浏览器 Network 面板里点那个 404 请求,看 Response Headers 中的 Status 字段。
这种“伪 404”在日志里也会显示 200,但内容是错误页。如果你在 access.log 里看到大量 200 响应,路径却像错误页(如 /404.html、/error),基本就是配置漏了 return 404 或 ErrorDocument 指令。


















