URL_CASE_INSENSITIVE必须显式设为true,TP3.2配'URL_CASE_INSENSITIVE'=>true,TP5.x用'url_convert'=>true,TP6.x已移除;__URL__不自动小写,路由匹配严格区分大小写,Linux上线前须验证配置与文件命名。

URL_CASE_INSENSITIVE 配置项必须显式设为 true
ThinkPHP 默认在调试模式下是区分 URL 大小写的,即使你写了 UserGroup/index 和 user_group/index,框架也会当作两个不同控制器处理——除非你主动关闭大小写敏感。关键不是“能不能”,而是“必须配”。
配置位置取决于版本:
- ThinkPHP 3.2:在项目配置文件(如
Conf/config.php或Conf/convention.php)中添加:'URL_CASE_INSENSITIVE'=>true - ThinkPHP 5.x:在
config/app.php或application/config.php中设置:'url_convert' => true(注意键名已变,不是URL_CASE_INSENSITIVE) - ThinkPHP 6.x:该配置已移除,统一由路由和命名规范控制,
url_convert不再生效,需靠路由规则或中间件转换
漏配或配错位置(比如只改了 convention.php 却被项目级 config.php 覆盖),会导致看似生效实则无效。
__URL__ 模板变量不随 URL_CASE_INSENSITIVE 自动小写
即使你开了 URL_CASE_INSENSITIVE=>true,模板里用 __URL__ 输出的链接仍是原始大小写形式,比如控制器类名是 UserTypeAction,它仍会生成 /usertype/index 而非 /user_type/index——这是 ThinkPHP 的一个经典坑。
立即学习“PHP免费学习笔记(深入)”;
原因在于 __URL__ 的生成逻辑早于路由解析,它直接读取 MODULE_NAME 常量,而该常量未经过大小写转换处理。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
临时绕过办法:
- 手动拼接:用
{:U('user_type/index')}替代__URL__ - 重写
Dispatcher.class.php(TP3.2):修改181行附近对MODULE_NAME的处理,加上strtolower()和下划线转换逻辑 - TP5+ 推荐用
url()辅助函数,它会尊重路由和命名映射,比__URL__可靠
路由规则优先级高于大小写配置
当你同时开启路由(URL_ROUTER_ON=>true)并定义了静态规则,比如:'my'=>'Index/index',那么无论 URL_CASE_INSENSITIVE 是 true 还是 false,访问 /My 都不会命中该规则——路由匹配是严格字符串比对,不走大小写转换流程。
这意味着:
- 路由规则本身要写成你期望用户输入的形式(全小写最稳妥)
- 动态路由如
':id/:name'也不做大小写归一化,/123/ABC和/123/abc会被视为同一请求,但参数值保留原样 - 正则路由(如
'/^user\/(\w+)$/i')可加i标志实现忽略大小写,但要注意 ThinkPHP 的路由正则支持有限,i在部分旧版本中不生效
Linux 服务器上线后必须验证大小写行为
Windows 开发环境常掩盖问题:文件系统不区分大小写,UserGroupAction.class.php 和 usergroupaction.class.php 都能加载成功;但 Linux 下一旦配置没生效,http://site.com/UserGroup/index 就直接报 404。
上线前务必确认两件事:
- 实际运行的配置是否加载了
URL_CASE_INSENSITIVE=>true(用dump(C('URL_CASE_INSENSITIVE'))检查) - 控制器文件命名是否符合 ThinkPHP 规范(如
UserGroupAction.class.php对应 URL 中的user_group,而非usertype或UserGroup) - Apache/Nginx 是否启用了 PATH_INFO 支持,否则大小写配置可能根本没机会执行
最易被忽略的是:ThinkPHP 3.2 的 URL_CASE_INSENSITIVE 只影响控制器/操作方法的定位,不影响模块分组(GROUP_NAME)和 URL 后缀(如 .html)的大小写判断——这些仍需单独处理。


















