ThinkPHP 5.1 是否区分 URL 大小写取决于配置项 URL_CASE_INSENSITIVE,默认 true 时 user/read 与 User/Read 均可匹配 User 控制器的 read 方法;设为 false 则需完全一致,易出错。

ThinkPHP 5.1 的伪静态规则本身不强制区分大小写,但是否区分,取决于配置项 URL_CASE_INSENSITIVE 的设置,而不是 Nginx 或路由规则本身的语法。
这个配置控制的是 URL 解析阶段对控制器名、方法名、模块名等的匹配行为,和伪静态后缀(如 .html)或路径中 /admin/ 这类前缀无关。也就是说:
- 伪静态规则(比如
Route::get('user/:id', 'User/read'))写成小写或大写,在定义时是字符串匹配,本身无大小写问题; - 真正影响“访问时是否必须严格大小写”的,是框架读取 URL 后解析控制器/操作时的行为。
关键配置:URL_CASE_INSENSITIVE
在 config/app.php 中:
'URL_CASE_INSENSITIVE' => true, // 推荐设为 true
-
✅ 设为
true:立即学习“PHP免费学习笔记(深入)”;
-
http://example.com/user/read和http://example.com/User/Read都能正确映射到User控制器的read方法; - 模块名
UserGroupAction会被自动转为user_group路由识别(下划线分隔); - 更友好,适合前端拼接 URL 或 SEO 友好型地址。
-
-
❌ 设为
false:- URL 必须与类名、方法名完全一致(包括大小写),例如
UserGroup/index才能匹配UserGroupAction类; - 容易因大小写错误导致 404,开发调试成本高,一般不建议。
- URL 必须与类名、方法名完全一致(包括大小写),例如
补充说明:伪静态后缀与大小写无关
- 后缀如
.html、.xml是通过'URL_HTML_SUFFIX' => 'html|xml'控制的,Nginx 或 Apache 不会因.HTML和.html不同而拒绝处理——只要后缀在白名单内,框架都会剥离后缀再解析路由; - Nginx 的
location ~* \.html$是不区分大小写的正则匹配,所以.HTML、.Html同样被识别为静态资源(若你做了排除)或交由 PHP 处理。
实际建议
- 始终开启
'URL_CASE_INSENSITIVE' => true; - 路由定义统一用小写风格(如
'admin/login'),保持可读性和一致性; - 不依赖大小写做权限或路由隔离(应使用路由分组、中间件或域名绑定);
- 若对接老系统或有历史 URL 强制要求,才考虑关掉该配置,但需同步规范所有 URL 输出方式。
注:该行为与 Nginx 是否区分大小写无关,Nginx 的 try_files 或 location 匹配逻辑不影响 TP 内部的控制器解析。



















