ThinkPHP 5.1.41伪静态生效需三者严格匹配:.htaccess必须置于public/目录并含index.php?/$1 [QSA,PT,L]规则;Nginx需在location ~ .php$块中补全fastcgi_param PATH_INFO $fastcgi_path_info;且运行目录设为/public;框架配置必须关闭普通模式('url_common'=>false)并开启路由。

ThinkPHP 5.1.41 的伪静态规则本身没有独立版本号,它完全依赖服务器配置与框架参数协同生效;直接套用网上泛泛的“TP5伪静态规则”大概率失败,因为关键变量是:public 目录位置、AllowOverride 设置、PATH_INFO 是否传递、以及 url_common 是否关闭——漏掉任意一个,index.php 就甩不掉。
Apache 下 .htaccess 必须放在 public/ 目录里
TP5.1+ 默认入口是 public/index.php,不是项目根目录下的 index.php。把 .htaccess 放错位置(比如放到含 application 的那层),规则永远不会触发。
-
.htaccess文件必须新建在public/目录下,且文件名带英文点号(.htaccess,不是htaccess) - 内容推荐用兼容性更强的
index.php?/$1写法(注意问号):
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
末尾用 index.php?/$1 而非 index.php/$1,能避免部分 Apache 版本丢参数;PT 标志不可省,否则 $_SERVER['PATH_INFO'] 拿不到路径段。
Nginx 必须补全 fastcgi_param PATH_INFO
TP5.1.41 默认走 PATH_INFO 模式(URL_MODEL = 1),但 Nginx 不默认传这个值。缺了这句,框架启动时就报 “URL pathinfo not supported”,页面直接 500。
立即学习“PHP免费学习笔记(深入)”;
- 在
location ~ \.php$块内,必须有这一行:
fastcgi_param PATH_INFO $fastcgi_path_info;
同时,location / 规则别只写 try_files $uri $uri/ /index.php?$query_string——入口在 public/,所以得写成:
location / {
try_files $uri $uri/ /public/index.php?$query_string;
}
宝塔用户额外注意:网站「设置 → 运行目录」必须选 /public,否则 $_SERVER['DOCUMENT_ROOT'] 指向错误,runtime 目录写入失败,后续所有缓存、日志都崩。
框架配置要关掉普通模式(url_common = false)
即使服务器规则写对了,如果 TP5.1.41 的 config/app.php 里还开着 'url_common' => true,请求仍会退化成 ?s= 参数解析,导致伪静态失效或 URL 混乱。
- 确认以下三项已启用且匹配:
'url_route_on' => true, 'url_common' => false, 'pathinfo_depr' => '/'
url_common => false 是硬性要求;若你用了子目录部署(如 http://domain.com/myapp/),还需在 config/app.php 中加一行:
'app_subdomain_deploy' => false,
否则子目录下路由识别会错位。
真正卡住人的从来不是规则本身,而是 public/ 目录层级、AllowOverride All、fastcgi_param PATH_INFO 这三处配置是否全部到位——少一个,index.php 就稳稳挂在 URL 里,怎么清浏览器缓存都没用。



















