404因web服务器未正确传递path_info:apache需启用mod_rewrite、allowoverride all并确保.htaccess在public目录;nginx需在location ~ .php$中配置fastcgi_param path_info $fastcgi_path_info,且try_files须置于location /块内。

ThinkPHP5.0.16 伪静态报错,**八成不是框架问题,而是 Nginx 或 Apache 没把原始路径传进 index.php,导致 $_SERVER['PATH_INFO'] 为空或解析失败**。直接看配置和验证点,别绕弯。
为什么访问 /user/list 报 404,但 /index.php/user/list 能打开
这是最典型的信号:Web 服务器压根没把请求转发给 ThinkPHP 入口文件。ThinkPHP5.0.16 默认依赖 PATH_INFO 模式(即 /index.php/xxx/yyy),不是 ?s=/xxx/yyy 兼容模式。
- Apache 下:
.htaccess必须放在public/目录(和index.php同级),内容不能漏RewriteEngine On和[QSA,PT,L] - Nginx 下:
location ~ \.php$块里必须有这行:fastcgi_param PATH_INFO $fastcgi_path_info;—— 缺了它,$_SERVER['PATH_INFO']就是空的,框架启动时直接中断 - 别信“宝塔选 ThinkPHP 预设就完事”:那个规则默认适配 TP5.0–5.1 的
?s=模式,而5.0.16若启用了pathinfo(默认开启),就必须走/index.php/xxx路径,预设规则不匹配
Nginx 配置中 try_files 写错位置或参数
try_files 必须写在 location / 块里,且必须在 location ~ \.php$ 之前;否则 PHP 处理块优先匹配,try_files 根本不执行。
- 正确 fallback 写法(入口在
public/):try_files $uri $uri/ /public/index.php?$query_string; - 错误写法:
rewrite ^(.*)$ /index.php/$1 last;—— 它会丢掉QUERY_STRING,$_GET变空,input()拿不到参数 - 如果站点 root 指向的是项目根目录(比如
/var/www/myapp/),但入口实际是/var/www/myapp/public/index.php,那$document_root/index.php就会拼错路径,报 “No input file specified”
Apache 下 .htaccess 不生效的三个硬伤
本地或局域网环境(如 phpStudy、XAMPP)最容易卡在这三处,检查顺序不能乱:
-
mod_rewrite模块没启用:Linux/macOS 执行apachectl -M | grep rewrite,Windows 查httpd.conf是否取消了#LoadModule rewrite_module modules/mod_rewrite.so的注释 -
AllowOverride不是All:必须在对应<directory></directory>块里写AllowOverride All(只写FileInfo不够) -
.htaccess放错了位置:它必须和public/index.php在同一目录,不是项目根目录(含application/那层)
怎么快速确认 PATH_INFO 到底有没有传进来
别猜,直接在 public/index.php 开头加一行:
var_dump($_SERVER['PATH_INFO'] ?? 'MISSING'); die();
访问 /user/list,如果输出 string(10) "/user/list",说明服务器传进来了;如果输出 MISSING 或空字符串,问题一定出在 Web 服务器配置层 —— Apache 没传,Nginx 没配 fastcgi_param PATH_INFO,或者规则根本没命中 index.php。
这个 var_dump 是唯一可信的判断依据,比任何日志或报错都直接。很多所谓“路由不生效”,其实是 PATH_INFO 从一开始就没到 PHP 手里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











