ThinkPHP 5.1.38 伪静态跑通的关键是服务器正确将请求交予 public/index.php:Apache 需启用 mod_rewrite、AllowOverride All、.htaccess 置于 public 目录并严格按格式书写;Nginx 需配置 try_files + fastcgi_param PATH_INFO 和 SCRIPT_FILENAME 使用 $realpath_root;框架需显式开启 url_route_on 和 pathinfo_depr;运行目录必须设为 /public。

ThinkPHP 5.1.38 伪静态能跑通,关键不在框架配置,而在服务器是否把请求真正交给了 index.php——配错一行规则、漏一个参数、入口目录设错,全站路由就 404。
Apache 下 .htaccess 规则必须放对位置且权限正确
ThinkPHP 5.1.38 默认入口在 public/ 目录,.htaccess 文件必须放在这个目录下(不是项目根目录),且 Web 服务器要有读取权限。常见错误是文件放在了上层目录,或 AllowOverride 被设为 None,导致规则完全不生效。
- 确认 Apache 已启用
mod_rewrite:运行apache2ctl -M | grep rewrite(Linux)或查看phpinfo()页面的 loaded modules -
.htaccess内容严格用以下格式(开头无空行、无中文标点):RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 若项目部署在子目录(如
/myapp/),必须加RewriteBase /myapp/,否则$1会丢掉前缀
Nginx 中 try_files 和 fastcgi_param 缺一不可
Nginx 不认 .htaccess,所有逻辑必须写进 server 配置。只加 try_files 不够,fastcgi_param 没配对,$_SERVER['PATH_INFO'] 就为空,TP5.1.38 的 PATH_INFO 模式直接失效。
- 在
location / { }块中写:try_files $uri $uri/ /public/index.php?$query_string;
- 在
location ~ \.php$ { }块中,确保有这行:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
($realpath_root是关键,不能写成$document_root) - 必须检查是否存在
fastcgi_param PATH_INFO $fastcgi_path_info;;如果没有,手动加在fastcgi_split_path_info指令之后
框架内 url_route_on 和 pathinfo_depr 必须显式开启
TP5.1.38 默认不强制开启路由,且默认 pathinfo_depr 是 /,但如果你改过它(比如设成 _),而服务器规则仍按 / 分割,就会解析失败。
立即学习“PHP免费学习笔记(深入)”;
- 打开
config/app.php,确认以下两项存在且为 true:'url_route_on' => true, 'pathinfo_depr' => '/'
-
url_html_suffix可设可不设,不影响伪静态主干逻辑;设成false反而更利于调试 - 不要依赖
URL_MODEL:TP5.1+ 已弃用该配置,只看url_route_on和服务器重写是否匹配
验证时别只测首页,要测带参数的真实路由
很多人验证只访问 /index/index 看有没有 404,这不够。TP5.1.38 的 PATH_INFO 解析脆弱点在多级参数和特殊字符,比如 /article/detail/id/123/title/my-post 这类 URL,一旦 PATH_INFO 截断或编码异常,就进不了控制器。
- 用
var_dump($_SERVER['PATH_INFO'] ?? null, $_GET['s'] ?? null);在public/index.php开头加一行,直观看服务器到底传了什么进来 - 如果
$_SERVER['PATH_INFO']是空,但$_GET['s']有值,说明你配的是 QUERY_STRING 模式(?s=xxx),得对应调整框架配置或换规则 - 宝塔用户注意:选“ThinkPHP 6”伪静态模板在 TP5.1.38 上可能多传一个
/,建议手动粘贴规则而非选模板
最常被忽略的是 public/ 目录作为实际 Web 根目录这一项——Nginx 的 root 或宝塔的“运行目录”必须指向 public,而不是项目根目录。设错这里,/public/index.php 就根本不会被当作脚本执行,所有重写都白搭。



















