php接口404多数因请求未进入php执行环节,需先确认web服务器是否将请求交给php(如检查apache的mod_rewrite与allowoverride、nginx的root及fastcgi_param配置),再排查框架路由匹配(如route:list验证)、重写规则干扰(如.htaccess或try_files缺失)及框架内部主动返回404。

PHP接口返回404,多数情况不是代码写错了,而是请求根本没进到PHP执行环节——先确认Web服务器是否把请求交给了PHP,再看框架是否识别了路径。
检查Web服务器有没有把请求交给PHP
如果访问 /api/users 返回404,但直接访问 /index.php 也404,说明问题出在服务器层:
- Apache:确认
mod_rewrite已启用(a2enmod rewrite),且虚拟主机配置中AllowOverride All生效;DocumentRoot必须指向含index.php的目录 - Nginx:检查
server块里的root是否准确指向项目根目录(如/var/www/myapp/public);location ~ \.php$块必须存在,并包含fastcgi_pass和关键参数: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:检查
route/app.php是否注册了该路由;用php think route:list查看是否加载成功 - 注意尾部斜杠:
/api/users和/api/users/在部分配置下不互通,统一约定并测试
排查重写规则是否干扰真实路径
很多“伪静态”配置会把所有请求都转给 index.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)):
- 在框架异常处理入口加日志,例如Laravel的
app/Exceptions/Handler.php中打印request()->fullUrl() - 查看PHP错误日志,搜索
NotFoundHttpException或类似关键词,确认是否有堆栈信息 - 原生Router(如FastRoute)需检查
$dispatcher->dispatch()返回值,区分Dispatcher::NOT_FOUND和其他状态
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











