Apache隐藏index.php需正确配置:1.启用mod_rewrite模块;2.设置AllowOverride All放开.htaccess权限;3.将含RewriteEngine On等规则的.htaccess置于public目录;url_model=2仅影响URL生成,不决定重写生效。
Apache 隐藏 index.php 不是 ThinkPHP 或其他框架“关掉”就能生效的功能,而是必须由 Apache 正确转发所有非静态请求到 index.php 入口文件。配置不到位,页面直接 404 或报 “No input file specified”。核心就三件事:启用模块、放开权限、写对规则。
这是前提,没它整个重写流程根本走不起来:
httpd.conf(路径通常为 /etc/httpd/conf/httpd.conf 或 C:Apache24confhttpd.conf)#LoadModule rewrite_module modules/mod_rewrite.so,删掉开头的 # 取消注释sudo systemctl restart httpd(Linux)或通过服务管理器重启(Windows)phpinfo() 页面,搜索 “Loaded Modules”,确认 mod_rewrite 在列表中.htaccess 文件能否生效,全看这个配置:
httpd.conf 或虚拟主机配置(如 vhost.conf)中,找到 <Directory> 块,通常是 根目录或 public/ 目录AllowOverride None 改成 AllowOverride All
<Directory>,每个都要检查并修改,不能漏www-data 或 apache)有读取 .htaccess 的权限文件必须放在 index.php 所在目录(通常是 public/),内容推荐用这个兼容性好、适配 TP6/TP8 的版本:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?s=$1 [QSA,L]</IfModule>
说明:
!-d 和 !-f 确保真实存在的文件(如 css/app.css)和目录不被重写,避免静态资源 404s=$1 把原始路径传给框架的 $_GET['s'],ThinkPHP 默认识别这个参数PATH_INFO 方式(如 index.php/$1),避开 cgi.fix_pathinfo 和 AcceptPathInfo 的兼容性坑.htaccess 可先新建文本文件,另存为时选择“所有文件”,文件名填 .htaccess(注意开头的点)虽然现代 ThinkPHP(6+)已弱化该配置,但若项目仍沿用旧版或自定义路由,建议确认:
config/app.php 或 conf.php 中,'url_model' => 2(表示重写模式)url_model 只影响框架内部 URL 生成逻辑,不影响重写本身