ThinkPHP5 Apache伪静态失败90%因.htaccess位置错误或AllowOverride未开启;.htaccess必须置于public目录(与index.php同级),且虚拟主机配置中对应<Directory>块需设AllowOverride All,并启用rewrite_module。

Apache 下 ThinkPHP5 伪静态配不成功,90% 是因为 .htaccess 放错位置或 AllowOverride 没开 —— 不是规则本身有问题。
确认 .htaccess 必须放在 public/ 目录下
ThinkPHP5.1+ 默认入口是 public/index.php,不是项目根目录(含 application/ 那层)。把 .htaccess 放在项目根目录,它根本不会被 Apache 加载。
-
.htaccess文件必须和index.php在同一级,也就是public/目录内 - 如果用宝塔或 phpEnv,检查网站「运行目录」是否设为
/public;否则$_SERVER['DOCUMENT_ROOT']指向错误,后续 runtime 写入失败 - 别用网上抄来的“放根目录 + RewriteBase /xxx”方案,除非你明确改过入口路径
AllowOverride 必须设为 All 或至少 FileInfo
Apache 默认禁用 .htaccess,即使文件存在、规则正确,也会静默忽略。
- 进虚拟主机配置(如
/www/server/panel/vhost/apache/yourdomain.conf),找到<Directory "/www/wwwroot/yourproject/public">块 - 确保里面有
AllowOverride All(不能是None) - 同时确认
mod_rewrite已启用:执行httpd -M | grep rewrite,输出应含rewrite_module - Windows 下用 phpEnv 的,进「Apache 设置 → 模块管理」勾选
rewrite_module
用这版 .htaccess 规则,兼容大多数 Apache 版本
别用 index.php/ 这种写法,部分 Apache + PHP-FPM 组合会丢参数;index.php?/ 更稳。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
立即学习“PHP免费学习笔记(深入)”;
<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>
- 末尾的
?/$1是关键:问号触发 QUERY_STRING 解析,斜杠保留 PATH_INFO 结构 -
[QSA,PT,L]缺一不可:QSA合并原有查询参数,PT让重写结果继续走 PHP 处理流程,L终止后续规则 - 如果项目部署在子目录(如
http://site.com/demo/),加一行RewriteBase /demo/在RewriteEngine On下方
验证是否真生效,别只看首页
首页能打开不代表伪静态通了。框架路由和服务器转发是两层,首页可能靠默认控制器兜底,掩盖问题。
- 访问一个明确不存在的路由,比如
/admin/login(假设你没建 Admin 控制器)—— 应该返回 ThinkPHP 的 404 页面,而不是 Apache 的 404 - 访问带参数的地址,如
/article/123,检查$_SERVER['PATH_INFO']是否为/article/123(可临时在public/index.php顶部加var_dump($_SERVER['PATH_INFO']);die;) - 如果看到
$_SERVER['PATH_INFO']是空或/index.php/xxx,说明重写没触发或 PATH_INFO 没传进来
最常被跳过的其实是 AllowOverride 和目录层级 —— 其他所有配置都对,这两点错一个,整个伪静态就静默失效。


















