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 不区分大小写的路由的主要内容,如果未能解决你的问题,请参考以下文章