Ubuntu 环境下排查 PHP 相关 404 的实用步骤
一、先分清日志类型与定位路径
- 404 本质是 HTTP 状态码,优先到 Web 服务器的访问日志确认请求是否真的返回 404;PHP 错误日志通常记录解析/执行错误,未必会记录 404。
- 常见日志路径与用途(Ubuntu 常见):
- Apache
- 访问日志:/var/log/apache2/access.log(用于确认 404 请求的 URL、时间、来源)
- 错误日志:/var/log/apache2/error.log(用于查看重写、权限、脚本启动等错误)
- Nginx
- 访问日志:/var/log/nginx/access.log
- 错误日志:/var/log/nginx/error.log
- PHP-FPM
- 错误日志:常见为 /var/log/php-fpm.log 或 /var/log/php7.x-fpm.log(按实际版本),或 /var/log/php-fpm/error.log
- PHP 自身 error_log
- 若 php.ini 中自定义了 error_log,需到该自定义路径查看(可能与 Web 服务器日志分离)
- 快速查看命令示例:
- 实时看访问日志:sudo tail -f /var/log/apache2/access.log
- 实时看错误日志:sudo tail -f /var/log/apache2/error.log
- 查找 404:grep " 404 " /var/log/apache2/access.log | less
- 若不确定 PHP 错误日志位置,可在 CLI 执行:php -i | grep ‘Loaded Configuration File’ 定位 php.ini,再查其中的 error_log 配置项。
二、从访问日志快速定位 404 请求
- 确认是否为真实 404:
- 命令:grep " 404 " /var/log/apache2/access.log | tail -n 20
- 关注字段:客户端 IP、请求 时间、请求 方法 与 URI、返回 状态码 404、User-Agent、Referer(便于追溯来源与死链)。
- 按 URI/路径聚合统计,找出高频缺失资源:
- 命令:grep " 404 " /var/log/apache2/access.log | awk ‘{print $7}’ | sort | uniq -c | sort -nr | head
- 结合 Referer 找出外部链接导致的死链:
- 命令:grep " 404 " /var/log/apache2/access.log | awk -F" ‘{print $4}’ | sort | uniq -c | sort -nr | head
- 实时监控新产生的 404:
- 命令:tail -f /var/log/apache2/access.log | grep --line-buffered " 404 "
三、结合错误日志与 PHP 配置确认根因
- 查看 Apache/Nginx 错误日志是否有重写或权限类报错(如 .htaccess 规则错误、目录无索引、权限不足):
- 命令:sudo tail -f /var/log/apache2/error.log 或 sudo tail -f /var/log/nginx/error.log
- 查看 PHP-FPM 日志是否有进程启动、执行失败等问题(如脚本不存在、权限被拒、FPM 配置异常):
- 命令:sudo tail -f /var/log/php7.x-fpm.log 或 sudo tail -f /var/log/php-fpm/error.log
- 核对 php.ini 的 error_log 配置,确保 PHP 错误被记录到预期文件;必要时在排查期间临时开启 log_errors = On,开发环境可开启 display_errors = On(生产环境请勿开启以免泄露敏感信息)。
四、常见成因与对应修复
- URL/路由错误:路径大小写、多余斜杠、资源已迁移;修正前端/路由配置或创建重定向。
- 重写规则不当(Apache 的 .htaccess,Nginx 的 rewrite):检查规则是否覆盖到目标路径,必要时修正或回退默认。
- 文件或目录不存在/路径错误:确认请求的文件在 DocumentRoot 或 Alias 映射目录下,路径大小写与真实文件一致。
- 权限问题:确保 Web 服务用户对文件/目录具备读取(目录需可执行)权限,常见为文件 644、目录 755。
- 入口文件缺失或路由未命中(如前端路由 SPA、框架路由):配置服务器将所有请求指向入口文件(如 index.php),由框架处理路由。
- 缓存/代理导致误判:清理浏览器与 CDN/反向代理 缓存后复测。
五、高效排查命令清单
- 同时跟踪访问与错误日志:sudo multitail /var/log/apache2/access.log /var/log/apache2/error.log
- 统计 Top 10 404 URI:grep " 404 " /var/log/apache2/access.log | awk ‘{print $7}’ | sort | uniq -c | sort -nr | head
- 统计 Top 10 404 来源页:grep " 404 " /var/log/apache2/access.log | awk -F" ‘{print $4}’ | sort | uniq -c | sort -nr | head
- 过滤某时间段的 404:grep " 404 " /var/log/apache2/access.log | grep “10/Nov/2025:14” | less
- 确认 PHP 错误日志位置:php -i | grep ‘Loaded Configuration File’;grep -i error_log /etc/php/*/fpm/php.ini
- 实时查看 PHP-FPM 错误:sudo tail -f /var/log/php7.4-fpm.log(按实际版本替换)