ThinkPHP5.1.40伪静态不跳转主因是Web服务器未将请求交至index.php:典型表现为/user/list 404而/index.php/user/list正常;需检查Nginx的location /块是否存在且位于location ~ .php$之前、fastcgi_param PATH_INFO是否正确传递、Apache下.htaccess是否启用及路径是否匹配。

ThinkPHP5.1.40 伪静态不跳转,不是框架改了,是 Nginx 或 Apache 没把请求交到 index.php 手里。最典型的表现就是:访问 /user/list 直接 404,但 /index.php/user/list 能正常打开。
location / 块没写,或位置错了
Nginx 的 location / 是伪静态的入口开关,它必须存在、且必须在 location ~ .php$ 之前。
- 如果你只写了
location ~ .php$,没写location /,Nginx 就不会对非 PHP 文件路径做任何重写,/user/list这种请求直接查文件系统,找不到就返回 404。 - 如果
location /写在location ~ .php$后面,Nginx 会优先匹配 PHP 块,绕过你的重写逻辑。
正确写法(放在 server 块内、location ~ .php$ 上方):
location / {
try_files $uri $uri/ /index.php?$query_string;
}注意:
立即学习“PHP免费学习笔记(深入)”;
-
try_files是推荐方式;旧式if (!-e $request_filename)在 PHP 8.4+ 下更易出问题 - 若项目在子目录(如
/myapp/),要改成/myapp/index.php?$query_string -
$query_string必须保留,否则?lang=zh-cn这类参数会丢失
fastcgi_param PATH_INFO 没传,或格式错
ThinkPHP5.1.40 默认用 PATH_INFO 模式解析路由,靠 $_SERVER['PATH_INFO'] 拿到 /user/list 这段路径。如果这个变量为空,路由就完全不触发。
检查 PHP 处理块(通常是 location ~ .php$ 内)是否包含这两行:
fastcgi_split_path_info ^(.+.php)(/.*)$;fastcgi_param PATH_INFO $fastcgi_path_info;
常见错误:
- 宝塔升级 PHP 后自动删掉了
fastcgi_param PATH_INFO行 - 把
$fastcgi_path_info错写成$path_info或$1 -
fastcgi_split_path_info正则漏了/*,导致无法截取路径
验证方法:在 public/index.php 开头加一行:
var_dump($_SERVER['PATH_INFO']); die();访问
/user/list,输出应为 /user/list;为空就说明没传过来。
Apache 下 .htaccess 不生效
ThinkPHP5.1.40 在 Apache 环境下依赖 .htaccess,但它不是放哪都管用。
必须同时满足:
-
mod_rewrite已启用(Linux 执行a2enmod rewrite,Windows 检查httpd.conf中LoadModule rewrite_module是否取消注释) -
.htaccess文件放在public/目录下(和index.php同级) - 对应的
<directory></directory>块中设置AllowOverride All(仅AllowOverride FileInfo不够)
.htaccess 内容必须严格如下(无空行、无中文标点):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]若部署在子路径(如 <a href="https://www.php.cn/link/215b64d69046dea9cf81553763cecc92">https://www.php.cn/link/215b64d69046dea9cf81553763cecc92</a>),需额外加一行:
RewriteBase /myapp/
最容易被忽略的一点:入口路径没对齐
ThinkPHP5.1.40 入口仍是 index.php,但很多人升级后误以为要像 TP6 那样设运行目录为 /public——其实它没有 /public 结构,默认入口就在项目根目录。
如果你把站点根目录设成了 /public,而 index.php 实际在上层,Nginx 就会找不到入口文件,所有重写都失效。
验证方式:直接访问 <a href="https://www.php.cn/link/d11f1b8cff2f4bb3eae5b612a9e468ef">https://www.php.cn/link/d11f1b8cff2f4bb3eae5b612a9e468ef</a>,能打开才算入口路径正确。
如果只能通过 /public/index.php 访问,说明你项目结构已按 TP6 改过,那就要按 TP6 规则配,不能套用 TP5.1 的配置。



















