Yii2后端UrlManager异常:URL伪静态及页面跳转问题求助
看起来你遇到了Yii2项目里后端URL的两个典型问题,我来一步步帮你排查解决:
问题1:后端去掉index.php出现404错误
这个问题大概率是URL重写规则没配置到位,导致服务器没法把不带index.php的请求转发到Yii的入口文件。按以下步骤检查:
确认服务器的URL重写模块已启用
- 如果你用Apache,先确保
mod_rewrite模块已经开启。可以通过phpinfo()查看,或者在Linux执行apache2ctl -M、Windows里检查Apache配置文件的LoadModule rewrite_module行来确认。没开启的话,启用后重启Apache。 - 如果你用Nginx,直接跳到第3步的Nginx配置部分。
- 如果你用Apache,先确保
检查后端目录的
.htaccess文件
后端的backend/web/目录下必须有.htaccess文件,内容应该是这样:RewriteEngine on # 若请求的是真实存在的文件/目录,直接访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 否则把请求转发到index.php RewriteRule . index.php要是文件不存在就新建一个,内容不对就替换成上面的代码。
确认Yii2后端的UrlManager配置
打开backend/config/main.php,找到components里的urlManager,确保开启了美化URL并隐藏入口文件:'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ // 自定义路由规则可以加在这里,默认空也没问题 ], ],如果你用Nginx,还需要在server块里添加重写规则:
location /backend/web/ { try_files $uri $uri/ /backend/web/index.php?$args; }修改后记得重启Nginx。
问题2:访问backend/web/index.php/site/index被重定向,无法打开
这个情况基本是后端权限控制导致未登录用户被强制跳转到登录页。Yii2后端默认会对所有页面做登录校验,未登录用户访问除login、logout外的页面都会被重定向。
检查后端SiteController的权限配置
打开backend/controllers/SiteController.php,找到behaviors方法里的access规则:public function behaviors() { return array_merge(parent::behaviors(), [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error'], 'allow' => true, ], [ 'actions' => ['logout', 'index'], 'allow' => true, 'roles' => ['@'], // 表示仅登录用户可访问 ], ], ], ]); }如果你希望未登录用户也能访问
site/index,把index加到第一个规则的actions里就行:[ 'actions' => ['login', 'error', 'index'], 'allow' => true, ],要是你已经登录了还是被重定向,检查下
backend/config/main.php里的defaultRoute有没有被改成site/login,这种情况会影响默认路由跳转。清除缓存
有时候缓存会导致异常重定向,你可以清除浏览器的Cookie和缓存,或者在后端执行php yii cache/flush-all命令清空Yii缓存,再重新测试。
内容的提问来源于stack exchange,提问作者skyc

