PHP接口返回404绝大多数因请求未进入PHP执行环节,需先确认Web服务器是否将请求交给PHP(如Apache启用mod_rewrite且AllowOverride All、Nginx root和fastcgi_param配置正确),再排查框架路由匹配、重写规则干扰及框架内部主动返回404。

PHP 8.1接口返回404,绝大多数情况不是代码写错了,而是请求压根没进到PHP执行环节——先确认Web服务器是否把请求交给了PHP,再看框架有没有识别路径。
检查Web服务器有没有把请求交给PHP
如果访问 /api/users 和 /index.php 都返回404,问题一定在服务器层:
-
Apache:确认已启用
mod_rewrite(运行a2enmod rewrite),且虚拟主机中AllowOverride All生效;DocumentRoot必须指向含index.php的目录(如/var/www/myapp/public) -
Nginx:检查
server块里的root是否准确(比如root /var/www/myapp/public;);location ~ \.php$块必须存在,并包含完整参数:fastcgi_pass unix:/run/php/php8.1-fpm.sock;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -
快速验证:在
index.php开头加<?php die('PHP hit'); ?>,刷新接口地址。没输出就说明PHP根本没运行
确认URL是否匹配框架路由规则
如果 /index.php 能打开,但 /api/users 404,问题大概率在路由层:
-
Laravel:运行
php artisan route:list,看/api/users是否在列表里,HTTP方法(GET/POST)和中间件是否匹配 -
ThinkPHP 8.1:检查
route/app.php或config/route.php是否注册了该路由;用php think route:list确认是否加载成功 - 注意尾部斜杠:
/api/users和/api/users/在部分配置下不互通,统一约定并测试
排查重写规则是否干扰真实路径
很多“伪静态”配置会把所有请求转给 index.php,但若规则写错,连真实存在的 .php 文件也会被拦截:
立即学习“PHP免费学习笔记(深入)”;
- 临时重命名
.htaccess为.htaccess.bak,改用完整路径测试,例如/index.php/api/users—— 如果这时能通,问题就在重写规则 - Apache 下确保
RewriteCond %{REQUEST_FILENAME} !-f这类判断保留,避免覆盖真实PHP文件 - Nginx 中,
try_files $uri $uri/ /index.php?$query_string;必须放在location /块内,不能漏掉$query_string,否则$_GET参数丢失
验证是不是框架内部主动返回404
请求进了PHP,但没匹配到任何路由,框架自己抛出404(如Laravel的 abort(404) 或 ThinkPHP 的路由未定义):
- 查看PHP错误日志,搜索
NotFoundHttpException、Route not defined或类似关键词,确认是否有堆栈信息 - ThinkPHP 8.1 若开启强制路由(
'route_check' => true),未定义的路径会直接404;可临时关闭该配置测试 - 在框架入口或异常处理逻辑中加日志,例如在
app/Exceptions/Handler.php的render()方法里打印request()->fullUrl()



















