Laravel 不区分大小写的路由

Posted

技术标签:

【中文标题】Laravel 不区分大小写的路由【英文标题】:Laravel case insensitive routes 【发布时间】:2014-03-10 23:14:38 【问题描述】:

如何定义不区分大小写(a 的一部分)的路由?

例子:

Route::get('/userId/profile'); http://domain.com/123/profile 工作正常。

在路线的固定部分使用大写字母不起作用:

http://domain.com/123/Profile 不起作用 http://domain.com/123/proFILE 不起作用

我了解如何使用 ->with() 使像 parameter 这样的参数使用正则表达式模式,但这对我处理路由的固定部分没有帮助,如上所述。

【问题讨论】:

严格来说,使用参数和正则表达式可以帮助解决您的特定问题(将配置文件转换为动态参数,指定它必须是单词'profile'不区分大小写)但是我知道这远非理想的解决方案。虽然是明确的权宜之计。 固定部分不能不区分大小写,但如果它是动态参数,您可以按照您已经知道的方式进行操作。 您尝试过类似Route::get('userId/profile','Controller@action')->where('profile','/profile/i'); 的方法吗? 【参考方案1】:

这可以通过以下方式定义路由来解决:

Route::get('/userId/profile')->with('profile', '(?i)profile(?-i)');

更聪明,将其定义为pattern,然后它也可以在路由组中使用。

Route::pattern('profile', '(?i)profile(?-i)');
Route::get('/userId/profile');

【讨论】:

不错。我喜欢模式解决方案 这对我有帮助。谢谢。 在第一个示例中,您是指->where() 而不是->with()where 使用路由正则表达式工作,而在 Laravel 5.3 中 with 会导致错误 Call to undefined method Illuminate\Routing\Route::with()【参考方案2】:

添加模式一次只适用于一个路由,如果您希望所有路由不区分大小写,请将其添加到前面部分的 /app/filter.php 文件中:

我写了一个要点:https://gist.github.com/samthomson/f670f9735d200773e543

编辑您的 app/filters.php 以检查路由中的大写字符并将它们重定向到转换后的路由。

【讨论】:

【参考方案3】:

对于那些使用 Apache 的人,您也可以这样做:

vhost 文件的顶部添加

RewriteEngine On
RewriteMap lowercase int:tolower 

在你的 .htaccess

RewriteCond $1 [A-Z]
RewriteRule ^(.*)$ /$lowercase:$1 [R=301,L]

【讨论】:

我没有尝试过上面提到的解决方案,只是想到了将 URL 转换为小写的一般转换:某些路由可能需要混合大小写,例如传递区分大小写的参数时通过 URL(例如某些哈希类型等)。

以上是关于Laravel 不区分大小写的路由的主要内容,如果未能解决你的问题,请参考以下文章

使用用户名的 Laravel 身份验证不区分大小写

Laravel 7 / SQL不区分大小写的where子句

Laravel“where”子句默认不区分大小写?

播放框架路由不区分大小写

使 Laravel 的 notIn 验证规则不区分大小写

Laravel Eloquent 不区分大小写的查询