不區分大小寫的路由

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

這將刪除原始驗證器並將你的驗證器新增到驗證器列表中。