不区分大小写的路由

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;
});

这将删除原始验证器并将你的验证器添加到验证器列表中。