ThinkPHP伪静态在Apache下需启用mod_rewrite并设AllowOverride All,.htaccess须放public目录且含Options +FollowSymLinks与正确RewriteBase,否则404或重定向循环。

ThinkPHP 的伪静态在 Apache 下不能直接套用 WordPress 规则,必须匹配框架的路由机制和入口文件位置,否则 404 或重定向循环是常态。
确认 mod_rewrite 已启用且 AllowOverride 允许覆盖
Apache 默认不读取 .htaccess,两个配置项缺一不可:
-
LoadModule rewrite_module modules/mod_rewrite.so在httpd.conf中必须取消注释(或单独添加一行) - 对应网站目录的
<Directory>块里,AllowOverride None必须改为AllowOverride All;如果是虚拟主机,该配置通常在vhost.conf或站点配置文件中 - 改完后必须执行
sudo systemctl restart apache2(Linux)或重启 phpStudy/Apache 服务(Windows)
ThinkPHP 5.1+ 标准 .htaccess 规则写法
规则要满足三个前提:入口是 public/index.php、隐藏 index.php、支持 PATHINFO 路由。常见错误是把 RewriteBase 设错或漏掉 Options +FollowSymLinks 导致 403:
- 确保
.htaccess放在public/目录下(不是项目根目录) - 内容必须包含
Options +FollowSymLinks -Multiviews,否则部分 Apache 版本会拒绝解析 -
RewriteBase值取决于部署路径:根目录填/,子目录如/tp5/就填/tp5/(末尾斜杠不能少) - 标准规则示例(适配 TP5.1+):
<IfModule mod_rewrite.c>
Options +FollowSymLinks -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
二级目录部署时 RewriteBase 和入口路径易错点
比如 ThinkPHP 部署在 http://example.com/myapp/,但访问 /myapp/index.php/welcome 仍 404,问题往往出在这三处:
立即学习“PHP免费学习笔记(深入)”;
-
RewriteBase写成/—— 正确应为/myapp/ -
index.php被误放在项目根目录,实际应位于myapp/public/,而.htaccess也必须放在此处 - Apache 配置中未对子目录显式启用
AllowOverride All,只改了根目录的<Directory "/var/www/html">,没管<Directory "/var/www/html/myapp/public">
调试时怎么看是不是规则没生效
最直接的办法是临时在 .htaccess 里加一条强制跳转规则:
RewriteRule ^test-redirect\.html$ https://example.com/ [R=302,L]
如果访问 /test-redirect.html 没跳转,说明 mod_rewrite 没启用或 AllowOverride 仍为 None;如果跳转了但业务 URL 仍 404,问题就在规则逻辑或入口路径上。别依赖浏览器缓存,每次改完都清空 DNS 和本地缓存再试。



















