不区分大小写的路由
Laravel 的路线区分大小写。这意味着一条路线就好
Route::get('login', ...);
将匹配一个 GET 请求到/login
,但不会匹配到/Login
的 GET 请求。
为了使你的路由不区分大小写,你需要创建一个新的验证程序类,该类将根据已定义的路由匹配请求的 URL。新验证器与现有验证器之间的唯一区别是,它将在编译路由的正则表达式末尾附加 i 修饰符,以切换启用不区分大小写的匹配。
<?php namespace Some\Namespace;
use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;
class CaseInsensitiveUriValidator implements ValidatorInterface
{
public function matches(Route $route, Request $request)
{
$path = $request->path() == '/' ? '/' : '/'.$request->path();
return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
}
}
为了让 Laravel 使用你的新验证器,你需要更新用于匹配 URL 到路由的匹配器列表,并将原始 UriValidator 替换为你的。
为此,请在 routes.php 文件的顶部添加以下内容:
<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;
$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) {
return get_class($validator) != UriValidator::class;
});
这将删除原始验证器并将你的验证器添加到验证器列表中。