ThinkPHP在Apache下隐藏index.php的关键在于服务器配置:必须启用mod_rewrite模块、设置AllowOverride All(Apache 2.4+还需Require all granted)、在public目录下配置正确.htaccess文件(含RewriteBase子目录适配),并清除浏览器301缓存验证。

ThinkPHP在Apache下隐藏index.php,关键不在框架本身,而在于Apache能否把非静态资源的请求准确转发给index.php处理。只要服务器配置到位,框架会自动适配生成干净URL。
确认并启用mod_rewrite模块
这是前提条件,缺一不可:
- 检查模块是否已加载:运行
httpd -M | grep rewrite或a2enmod rewrite(Debian/Ubuntu);若无输出,需启用并重启Apache - Windows下打开
httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so - 确保
rewrite_module在服务启动时生效,重启Apache验证
放开.htaccess文件执行权限
Apache默认禁止用户自定义重写规则,必须显式允许:
- 编辑虚拟主机配置(如
/etc/apache2/sites-available/000-default.conf)或主配置中的<directory></directory>块 - 将
AllowOverride None改为AllowOverride All(仅设FileInfo不够,需完整覆盖) - Apache 2.4+ 还需添加
Require all granted,否则可能返回403错误掩盖真实问题
配置正确的.htaccess文件
该文件必须放在项目入口目录(通常是 public/),内容如下:
立即学习“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>
注意:
- 若项目部署在子目录(如
http://example.com/myapp/),必须添加RewriteBase /myapp/ - 部分高版本Apache对
index.php/$1兼容性差,可尝试改为index.php?/$1或index.php [L,E=PATH_INFO:$1] - Windows下无法直接新建
.htaccess,可用记事本另存为,或命令行执行ren xxx .htaccess
验证与排错要点
配置后不是立刻生效,需逐项确认:
- 清除浏览器缓存,尤其避免301重定向残留导致误判
- 访问一个不含
index.php的URL(如/index/index),看是否正常响应而非404 - 检查Apache错误日志(
error.log),常见报错包括:模块未加载、AllowOverride权限不足、路径不匹配 - ThinkPHP的
url_model设为2(REWRITE模式)仅影响URL生成,不决定重写是否成功——它只是让U()、url()等函数输出不带index.php的链接



















