yii路由配置不生效的主因是enableprettyurl与showscriptname未配对且web服务器重写规则缺失;必须同时满足:enableprettyurl设为true、showscriptname设为false、apache需.htaccess开启rewriteengine或nginx需配置try_files指令,缺一则rules不触发。

Yii 路由配置不生效,90% 是因为 enablePrettyUrl 和 showScriptName 没配对,或 Web 服务器重写规则没跟上——这两项不满足,rules 数组里写得再漂亮也完全不触发。
为什么写了 rules 却还是 /index.php?r=site/index
根本原因是 URL 美化未真正启用。必须同时满足三个条件:
-
enablePrettyUrl设为true -
showScriptName设为false - Web 服务器(Apache/Nginx)已配置重写,把请求兜底到
index.php
缺一不可。比如 Nginx 配置漏了 try_files $uri $uri/ /index.php?$args;,哪怕 PHP 层全对,访问 /site/about 也会直接 404;Apache 则必须在 web/ 目录下有正确 .htaccess 并开启 RewriteEngine On。只改 PHP 配置是白忙。
自定义路由规则怎么写才匹配成功
规则顺序和语法细节决定是否命中:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 规则按数组顺序从上到下匹配,更具体的放前面,比如
'post/<id:>' => 'post/view'</id:>要比'<controller:>/<action:>' => '<controller>/<action>'</action></controller></action:></controller:>靠前 - 路径模板里用
<pattern></pattern>提取参数,<id:></id:>表示只接受数字,<slug:></slug:>可用于英文标题 - value 必须是字符串格式的路由(如
'post/view'),不能是数组;若用了数组(如['route' => 'post/view']),该规则仅用于解析请求,Url::to()生成时会跳过它 - 路径中只放结构化参数(如 ID、用户名),分页、排序等查询参数应留在
Url::to()的第二个参数里,由框架自动拼成?page=2&sort=date
RESTful API 里加自定义动作老是 404
核心问题在于 extraPatterns 被前置规则吞掉了:
- 必须用
'class' => 'yii\rest\UrlRule',普通UrlRule完全忽略extraPatterns - 键名严格为
'POST activate'这种格式:大写 HTTP 方法 + 一个空格 + 动作名(短横线风格),'post activate'或'POST/activate'都无效 - 如果想支持带 ID 的动作(如
POST /users/123/activate),pattern必须显式包含占位符:'pattern' => 'users/<id:>'</id:>,否则extraPatterns不会注入到带 ID 的路径中 - 调试时可临时加
'suffix' => '.json',避免export被当成 ID 解析成view动作
怎么确认某条路由规则到底有没有被匹配
最直接的办法是开日志,而不是靠猜:
- 在
config/web.php的log组件里加一个FileTarget,categories设为['yii\web\UrlManager'] - 在任意 action 开头加
\Yii::info("Route: " . \Yii::$app->requestedRoute, 'yii\web\UrlManager'); - 访问目标 URL 后查
@runtime/logs/route.log,看是否记录了匹配结果;没日志说明规则压根没跑进 UrlManager,大概率是enablePrettyUrl关着,或请求被 Web 服务器直接拒了
别依赖浏览器地址栏或 Url::to() 输出反推——它可能走的是 fallback 规则,和实际请求匹配路径不是一回事。










