XAMPP中ThinkPHP5的.htaccess不生效的根本原因是mod_rewrite未启用且AllowOverride为None;需在httpd.conf中取消LoadModule rewrite_module注释、将对应Directory的AllowOverride设为All,并重启Apache。

XAMPP 默认不启用 mod_rewrite,所以直接放 .htaccess 一定失败 —— 这是 90% 的人卡住的根本原因。
为什么 ThinkPHP5 的 .htaccess 在 XAMPP 里不生效
ThinkPHP5 官方推荐的 .htaccess 内容(含 RewriteEngine On 和 RewriteRule)本身没问题,但 Apache 必须满足两个前提才能读取它:
-
mod_rewrite模块未启用(httpd.conf中#LoadModule rewrite_module modules/mod_rewrite.so仍被注释) -
AllowOverride被设为None(导致.htaccess文件被完全忽略) - 部分用户还改了
DocumentRoot,但没同步更新对应<directory></directory>块里的路径,造成配置错位
必须改的两个 httpd.conf 配置项
打开 C:\xampp\apache\conf\httpd.conf(或你实际安装路径下的对应文件),确认以下两处已修改:
- 搜索
LoadModule rewrite_module,删掉行首的#,确保这行是:LoadModule rewrite_module modules/mod_rewrite.so - 搜索
<directory></directory>(路径需和你的DocumentRoot一致),把其中的AllowOverride None改成AllowOverride All - 如果项目不在
htdocs下(比如放在D:\myapp),则要找到对应路径的<directory></directory>块,并同样设AllowOverride All
改完保存,**必须重启 Apache 服务**(不是只刷新页面)。
立即学习“PHP免费学习笔记(深入)”;
ThinkPHP5 的 .htaccess 写法与常见陷阱
将以下内容保存为项目根目录(即含 public/ 的同级目录)下的 .htaccess 文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
- 别用网上流传的
RewriteRule ^(.*)$ index.php [L]—— 它会丢掉 PATH_INFO,导致 TP5 路由解析失败 -
index.php/$1中的/是关键,TP5 依赖它提取路由参数;若写成index.php?$1或index.php?_url=/$1,PATH_INFO模式就失效了 - 确保
public/是 Web 可访问入口,且.htaccess放在public/目录下(不是项目根目录)—— ThinkPHP5 官方结构要求如此
还要检查 ThinkPHP5 自身配置
编辑 public/index.php 或 application/config.php(依版本而定),确认:
-
'url_route_on' => true(开启路由) -
'url_html_suffix' => ''(清空后缀,避免干扰) -
'url_common_param' => false(关闭普通模式,强制使用 PATH_INFO) - 如果用了
nginx或其它环境迁移过配置,留意'url_convert' => true是否被误关
最易被忽略的一点:XAMPP 启动后,Apache 日志(logs/error.log)里一旦出现 Invalid command 'RewriteEngine',说明 mod_rewrite 没启用;若出现 File does not exist: D:/myapp/index.php/xxx,说明 .htaccess 根本没被加载 —— 这时回看 AllowOverride 设置比调代码更有效。



















