yii1.1.32项目404因url规则顺序错乱、正则冲突或web服务器未正确转发;需验证php与web服务正常,确认enableprettyurl=true、showscriptname=false及重写规则三者齐备,并将精确路由规则置于泛用规则之前。

Yii1.1.32项目部署后访问页面报404或跳转到错误控制器,大概率是URL规则顺序错乱、正则冲突或Web服务器未正确转发请求导致的路由解析失败。
确认请求是否真正进入Yii框架
先排除Web服务器层拦截:在项目web根目录(如/web)下新建一个test.php,内容为。用浏览器直接访问/test.php——能显示OK,说明PHP和Web服务正常;访问/index.php/site/index也正常,但/site/index 404,则问题出在URL美化环节。
检查Apache的.htaccess是否存在且生效:确保AllowOverride All已开启,且mod_rewrite已启用。Nginx用户需确认try_files $uri $uri/ /index.php?$args;已写入server块。
【关键前提】必须同时满足:enablePrettyUrl = true、showScriptName = false、Web服务器重写规则兜住所有非静态资源请求——三者缺一,路由规则根本不会被加载。
修正URL规则顺序与正则冲突
Yii1路由按数组顺序从上到下匹配,命中即停。常见冲突是泛用规则挡在了精确规则前面:
① 打开protected/config/main.php,定位到'urlManager' => array(...)配置段。
② 将最具体的规则放在最前面,例如支持/post/123的规则:'post/' => 'post/view',必须排在
③ 避免正则贪婪匹配:不要写会匹配空字符串,导致/user被误判为controller=user, action=空而找不到动作。应明确限定:'/' => '/'。
④ 删除冗余通配规则:'' => '/index'这类规则极易与真实控制器名冲突,比如存在user控制器时,/user会被匹配成controller=user, action=index,但若user控制器无index动作就直接404——不如删掉,让其走默认路由逻辑。
处理模块化路由冲突
如果项目启用了模块(modules),且模块ID与URL前缀相同(例如模块叫admin,又配置了'admin/' => 'admin/'),Yii1会优先尝试加载模块而非匹配路由规则,造成分流失败。
方法一:改模块ID,避开路径语义重叠
把modules/admin目录保留,但在main.php中注册模块时改用adminPanel作为模块ID:'modules'=>array('adminPanel'=>array('class'=>'application.modules.admin.AdminModule')),再配路由'admin/' => 'adminPanel/'。
方法二:强制路由优先级
在urlManager.rules数组最顶部插入一条高优先级规则:'admin//' => 'admin//',并确保该规则不带module参数——Yii1会先按此规则解析,再 fallback 到模块加载逻辑。
【易错点】Yii1不支持enableStrictParsing开关,一旦某条规则正则无法匹配当前URL,就会跳过继续试下一条;但如果所有规则都未命中,最终由CUrlManager::parseUrl()返回默认site/index,此时若site控制器不存在,就报404——务必保证至少有一条兜底规则。