Yii2路由大小写敏感默认开启,Linux下不匹配即404;控制器文件名须小写连字符、类名可驼峰、目录名须小写;action方法URL自动转kebab-case;关闭caseSensitive需统一小写配置且仍受文件系统限制。

有影响,而且影响是默认开启的——urlManager 的 caseSensitive 默认为 true,Linux 服务器上大小写不匹配直接 404。
控制器类名和文件名必须全小写加连字符
Yii2 路由解析时会把请求路径(如 getServerAddr)自动转成 get-server-addr 去匹配控制器 ID,但前提是控制器类文件本身命名合规:
- 文件名必须是小写 + 连字符形式,比如
get-server-addr-controller.php,不能是GetServerAddrController.php或getServerAddrController.php - 类名必须严格对应:`class GetServerAddrController extends Controller` → 错误;正确写法是 `class GetServerAddrController` 对应文件
get-server-addr-controller.php,但注意——类名本身允许驼峰,文件名必须小写连字符 - 目录名也必须小写:控制器放在
controllers/api/可以,但controllers/API/在 Linux 下会失败
action 方法名在 URL 中强制转为 kebab-case
方法 actionGetMobilePhone() 对应的路由不是 getMobilePhone,而是 get-mobile-phone。这是 Yii2 createAction() 内部硬编码的转换逻辑:
- 它用
str_replace('-', ' ', $id)→ucwords()→str_replace(' ', '', ...)拼出方法名 - 所以
user-info→UserInfo→actionUserInfo();但UserInfo作为请求路径会被拒绝,因为不符合/^[a-z0-9\-_]+$/正则 - 错误现象:访问
/bind/getMobilePhone返回 404,必须用/bind/get-mobile-phone
想关掉大小写敏感?可以,但要守规矩
设 'caseSensitive' => false 确实能让 GETSERVERADDR、getserveraddr 都映射到同一个控制器,但框架会立刻把控制器 ID 全转成小写,这就带来连锁约束:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 所有控制器映射(
controllerMap)的 key 必须小写,比如'get-server-addr' => 'appcontrollersGetServerAddrController' - 模块配置里
modules的键也得小写,'v1' => ['class' => 'apimodules1Module'],不能写'V1' - 如果你的控制器目录叫
Controllers(首字母大写),caseSensitive=false后它仍无法被加载,因为文件系统层面 Linux 就找不到
别碰 core 文件,用 urlManager::rules 显式映射更安全
遇到类似 getServerAddr 这种“非标准”入口,不要改 createController() 源码或正则表达式,直接在配置里加一条规则:
'rules' => [
'getServerAddr' => 'get-server-addr/index',
'api/v1/users' => 'v1/user/index',
],
这条规则绕过了控制器 ID 解析阶段,直接把请求路径绑定到目标路由。注意:value 必须是字符串格式的内部路由(不能是数组),且该规则要放在泛化规则(如 '<controller>/<action>')之前,否则会被提前匹配掉。
真正容易被忽略的是:caseSensitive 是个开关,但它的影响不只在 URL 解析层——它会穿透到文件系统调用、模块注册、甚至 Url::toRoute() 的生成逻辑里。一个字母大小写不对,可能在开发机(Windows)完全正常,上线就全挂。


















