yii2没有独立“路由缓存”,所谓路由不生效实为urlmanager未启用、配置未加载或web服务器rewrite未正确转发;需检查enableprettyurl与showscriptname是否同时启用、配置位置是否正确、opcache是否刷新及nginx/apache是否重载。

Yii2 路由缓存不存在,别被名字误导
Yii2 没有独立的“路由缓存”机制。你遇到的所谓“路由不生效”“新规则 404”“URL 重写失效”,大概率不是路由被缓存了,而是以下三类问题之一:路由配置未加载、URL 管理器(urlManager)配置未启用或未生效、Web 服务器(如 Nginx/Apache)的 rewrite 规则未正确转发。Yii2 的路由解析是运行时动态完成的,不依赖持久化缓存——它只可能被 PHP OPcache 缓存(编译字节码),但那和路由逻辑本身无关。
为什么改了 rules 却没反应?检查这几点
在 config/web.php 或环境配置中修改了 urlManager 的 rules 数组后仍不生效,常见原因包括:
-
urlManager组件未启用:'enablePrettyUrl' => true和'showScriptName' => false必须同时为true才能启用美化 URL;缺一不可 - 配置位置错误:高级模板中,
urlManager应统一配置在common/config/main.php(供 frontend/backend 共享),而不是只写在frontend/config/main.php里 - PHP OPcache 未刷新:如果你启用了 OPcache 且
opcache.validate_timestamps = 0(生产模式常见),那么修改 PHP 配置文件后需手动重启 PHP-FPM 或执行opcache_reset() - 浏览器或代理缓存了 301 重定向:旧路由曾返回过 301,浏览器会永久缓存该跳转;用隐身窗口测试,或临时把
rules中的某条改成 302 测试
真正需要清理的缓存:应用级配置与反射元数据
虽然没有“路由缓存”,但 Yii2 在构建路由匹配器、控制器动作映射、模型属性时,会缓存反射信息(如 Controller::actions() 返回值、ActiveRecord 的属性列表)。这些缓存由 yii\di\Container 和 yii\base\ReflectionCache 管理,受应用缓存组件影响。当新增控制器、动作或修改 public function actions() 后出现 404 或 “Unknown action”,可尝试:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 执行命令行清理:
php yii cache/flush-schema(清除 DB Schema 缓存,间接影响 AR 行为) - 更彻底地清空反射相关缓存:
php yii cache/flush-all(注意:这会清空所有缓存组件中的数据) - 若使用文件缓存,直接删除
@runtime/cache/目录下的reflection*文件(如reflection.dat) - 开发阶段可临时禁用反射缓存:在
common/config/main-local.php中添加'enableReflectionCache' => false(仅限调试)
Web 服务器层 rewrite 缓存才是真坑点
Nginx/Apache 自身不缓存路由逻辑,但它们的配置热加载有延迟,且某些反向代理(如 Cloudflare)会缓存 404 响应。排查步骤:
- 确认 Web 服务器配置已重载:
sudo nginx -s reload或sudo systemctl reload apache2 - 检查 rewrite 日志:Nginx 开启
rewrite_log on;+error_log /var/log/nginx/rewrite.log notice;,然后tail -f观察是否命中 rewrite 规则 - 绕过 CDN:在请求头加
Cache-Control: no-cache,或临时停用 Cloudflare 的“缓存一切”规则 - 验证基础 rewrite 是否工作:访问
/index.php?r=site/about能打开,但/about不能 → 问题 100% 出在 Web 服务器 rewrite 配置或urlManager设置
真正要盯住的,从来不是“路由缓存”,而是配置加载顺序、Web 服务 reload 状态、以及 OPcache 对 PHP 文件变更的惰性响应——这些地方一卡,比任何缓存都难排查。










