ThinkPHP 5.1.33伪静态需Web服务器(Apache/Nginx)配置重写规则并正确传递PATH_INFO,而非修改PHP路由配置;Apache须启用rewrite模块、AllowOverride FileInfo且.htaccess置于public目录;Nginx须设root为/public、配置fastcgi_param PATH_INFO及try_files规则,并在app.php中开启'url_route_on'=>true。

ThinkPHP 5.1.33 伪静态规则本身不写在 PHP 代码里,而是由 Web 服务器(Apache 或 Nginx)接管 URL 重写后交由框架路由处理;直接改 route.php 或 app.php 的 URL 配置项不会让 index.php 消失——那是服务器层的事。
Apache 下 .htaccess 规则必须放对位置且启用模块
很多人配置完规则却无效,90% 是因为:.htaccess 放错了目录,或 Apache 没启用 rewrite 模块,或 AllowOverride 被设为 None。
-
.htaccess必须放在public/目录下(即和index.php同级),不是项目根目录(含application的那层) - 确认 Apache 已启用
rewrite_module:Linux 下执行a2enmod rewrite,Windows 用 phpEnv 则进「Apache 设置 → 模块管理」勾选它 - 检查站点 vhost 配置中对应
public/目录的<Directory>块,含AllowOverride FileInfo Options(不能是None) - 推荐规则(兼容 PATH_INFO,TP5.1.33 默认依赖它):
<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 版本下会丢掉查询参数。
Nginx 下必须补全 PATH_INFO 且运行目录设为 /public
TP5.1.33 默认使用 PATH_INFO 模式解析 URL,但 Nginx 不默认传递 $_SERVER['PATH_INFO'],缺了就会报 “URL pathinfo not supported” 或直接 404。
立即学习“PHP免费学习笔记(深入)”;
- 在
location ~ \.php$块内,必须有这行:fastcgi_param PATH_INFO $fastcgi_path_info; - 整个站点的「运行目录」必须设为
/public(宝塔用户在网站设置里选,自建 Nginx 则确保root指向项目public目录) - 入口转发规则推荐用
try_files(比if更稳):
location / {
try_files $uri $uri/ /public/index.php?$query_string;
}
别漏掉 /public/ —— 直接写 /index.php 会导致 404,因为入口文件不在根目录。
框架配置要匹配服务器重写行为
服务器规则只是第一步,TP5.1.33 还需开启路由并确认 URL 模式与重写一致,否则仍会暴露 index.php 或返回 404。
- 确认
config/app.php中已启用路由:'url_route_on' => true - TP5.1.33 默认走
PATH_INFO模式,所以不要设'url_common' => true(普通模式会强制走?s=参数) - 如果坚持用
s=兼容模式(比如 Nginx 不想配PATH_INFO),可设'url_model' => 2,然后 Nginx 规则改用:rewrite ^(.*)$ /index.php?s=$1 last; - 检查
pathinfo_depr是否为'/'(默认就是,不用改)
最容易被忽略的是:Nginx 的 fastcgi_param PATH_INFO 和 Apache 的 PT 标志——它们不是可选项,是 PATH_INFO 能被 PHP 正确接收的必要条件;漏掉任何一个,$_SERVER['PATH_INFO'] 就为空,框架启动就中断。



















