ThinkPHP5在Apache下伪静态+域名绑定跑通的关键是AllowOverride All、.htaccess置于public目录、入口路径与PATH_INFO三者严丝合缝;缺一即导致404或回退index.php/xxx形式。

ThinkPHP5 在 Apache 下伪静态 + 域名绑定能跑通,关键不是规则写得有多漂亮,而是 AllowOverride All、.htaccess 放对位置、入口路径和 PATH_INFO 三者必须严丝合缝。漏掉任意一个,URL 就会 404 或回退到 index.php/xxx 形式。
Apache 必须启用 rewrite 模块且 AllowOverride 设为 All
很多本地环境(XAMPP、phpEnv、Mac 自带 Apache)默认不加载 rewrite,也不允许 .htaccess 生效——光放文件没用。
- 运行
apachectl -M | grep rewrite(macOS/Linux)或检查httpd.conf中是否有LoadModule rewrite_module modules/mod_rewrite.so,注释要删掉 - 找到你项目对应的
<directory></directory>块(不是全局httpd.conf里的默认目录,而是虚拟主机里那个指向public/的路径),确认含AllowOverride All,不能是None或FileInfo - 改完必须完整重启 Apache(
sudo apachectl restart),仅重载配置(reload)不生效
.htaccess 必须放在 public 目录且规则匹配入口模式
TP5.1+ 强制使用 public/index.php 作为唯一入口。如果你把 .htaccess 放在项目根目录(即 myapp/),而实际入口在 myapp/public/,那规则根本不会被读取。
-
.htaccess文件必须放在public/目录下,与index.php同级 - 内容用最简版,避免套
<ifmodule></ifmodule>增加调试干扰:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 如果域名绑定了子目录(如
http://test.local/myapp/),必须加RewriteBase /myapp/,且该路径要和浏览器地址栏中显示的完全一致
域名绑定后访问 404?先验证 PATH_INFO 是否送达
Apache 规则转发成功 ≠ ThinkPHP 能拿到路由参数。常见现象:页面空白或跳转到首页,var_dump($_SERVER['PATH_INFO']) 返回空字符串——说明 PATH_INFO 没传进来。
立即学习“PHP免费学习笔记(深入)”;
- 确认 Apache 的
mod_rewrite是以「标准 CGI」模式运行;若用fastcgi(如 php-fpm),需改用[L,E=PATH_INFO:$1]替代index.php/$1写法 - 更稳妥的做法:把规则末尾改成
index.php?s=$1,配合框架开启url_common_param配置(config/app.php中设'url_common_param' => true) - 别依赖
$_SERVER['PATH_INFO'],直接在控制器里打印input()或request()->pathinfo()看实际解析结果
最容易被忽略的是:域名绑定后,public/ 目录的物理路径和虚拟主机 <directory></directory> 中声明的路径必须一字不差,Windows 路径斜杠方向、大小写、末尾是否带反斜杠,都会导致 AllowOverride 失效。调试时别只盯规则,先 ls -la 或资源管理器确认真实路径结构。



















