Apache隐藏index.php需启用mod_rewrite、设AllowOverride All,并在.htaccess中写RewriteEngine on、两个RewriteCond判断文件和目录不存在、RewriteRule ^(.*)$ index.php/$1 [L],子目录部署时须配RewriteBase。

Apache环境下去掉index.php的Rewrite规则怎么写
直接在项目根目录的 .htaccess 里加标准重写规则即可,但必须确保 Apache 已启用 mod_rewrite,且 AllowOverride All 已在虚拟主机配置中开启,否则规则完全不生效。
常见错误是只复制了规则却没检查 httpd.conf 或站点配置里的 AllowOverride 设置,导致页面 404 或直接显示原始 URL。
- 确认
mod_rewrite已加载:apache2ctl -M | grep rewrite(Linux)或查看httpd.conf中是否取消了#LoadModule rewrite_module modules/mod_rewrite.so的注释 -
.htaccess内容必须放在web/目录下(不是项目根目录),因为 Yii2 的 Web 入口在web/index.php - 规则末尾必须加
[L]标志,否则可能被后续规则干扰;RewriteBase /要根据实际部署路径调整(如子目录部署需改为RewriteBase /myapp/)
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?r=$1 [L,QSA]
Nginx配置中如何隐藏index.php
Nginx 没有 .htaccess 机制,必须修改服务器配置块,且不能只靠 try_files 简单转发——漏掉对静态资源的显式匹配会导致 CSS/JS 404。
典型错误是把所有请求都甩给 index.php,结果 /css/main.css 也走 PHP 解析,返回 500 或空白响应。
- 必须在
location /块中用try_files $uri $uri/ /index.php?$args;,其中$args保留原始查询参数 - 要单独声明
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|svg|woff|woff2|ttf|eot)$并设置expires 1y;,避免静态文件被误导向 PHP - PHP fastcgi_pass 地址必须与你的 PHP-FPM 实际监听地址一致(如
unix:/var/run/php/php8.1-fpm.sock或127.0.0.1:9000)
Yii2应用配置里还要改什么
光配 Web 服务器不够,urlManager 必须启用 enablePrettyUrl 且关闭 showScriptName,否则生成的链接仍带 index.php,跳转和表单提交会失效。
容易忽略的是:如果项目部署在子目录(如 https://example.com/myapp/),baseUrl 和 scriptUrl 可能自动推导错误,导致 AJAX 请求 404。
-
'enablePrettyUrl' => true是前提,否则urlManager不启用重写逻辑 -
'showScriptName' => false才会让Url::to()生成的链接剔除index.php - 若使用子目录部署,建议显式设置
'baseUrl' => '/myapp',避免依赖自动检测
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [...],
],
去掉index.php后常见的404原因排查顺序
不是规则写错就是路径链断了一环,按这个顺序查比瞎试快得多:
- 访问
/index.php?r=site/about是否正常?——排除应用层问题(如路由未定义、控制器不存在) - 访问
/site/about返回 404?检查 Web 服务器是否真执行了重写(Apache 查error_log是否有 rewrite 日志;Nginx 加error_log /var/log/nginx/yii_debug.log notice;) - 静态资源(如
/css/site.css)是否 404?说明 Nginx 的静态文件 location 块缺失或路径不匹配 - 所有请求都 500?大概率是
index.php入口没被正确执行,检查 fastcgi_param SCRIPT_FILENAME 是否指向了真实路径(Nginx)或DocumentRoot是否设在web/下(Apache)
最常卡在第三步:开发者只顾着让 PHP 路由通,忘了静态文件得直出。这点在前后端分离或用了 asset bundle 的项目里尤其关键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











