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

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

例子:

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

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

【问题讨论】:

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

标签: regex laravel laravel-4 case-insensitive laravel-routing


【解决方案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(例如某些哈希类型等)。
    猜你喜欢
    • 2020-01-26
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2014-03-27
    • 2016-12-16
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多