通过中间件检查子域是否存在

Check if subdomain exist via middleware

我想在将用户重定向到登录表单之前检查子域是否存在。所以我想在“auth”中间件之前应用“website”中间件。

web.php:

Route::domain('{website}.localhost')->middleware(['website', 'auth'])->group(function () {
    Route::get('/', [HomeController::class, 'index'])->name('home');
    //others routes
});

网站中间件:

if(Website::where('domain_name', $request->route('website'))->exists())
{
    return $next($request);
}
else
{
    abort(404);
}

如果我尝试转到 http://fakedomain.localhost,我将被重定向到登录表单,而不是收到 404。

编辑 1: 我在 kernel.php

中注册了我的中间件

您可以尝试调整中间件的优先级,使其 运行 这个中间件优先于 'auth'。您可以静态定义中间件优先级列表(已在基础 Illuminate\Http\Kernel 上定义),也可以动态地添加到服务提供商中的中间件优先级列表中。

在服务提供商的 boot 方法中:

use Illuminate\Http\Contracts\Kernel;

public function boot()
{
    $this->app[Kernel::class]->prependToMiddlewarePriority(YourMiddleware::class);
}

或者您可以在 App\Http\Kernel:

中静态定义列表
protected $middlewarePriority = [
    \App\Http\Middleware\YourMiddleware::class,

    \Illuminate\Cookie\Middleware\EncryptCookies::class,
    ...
];

Laravel 9.x Docs - Middleware - Registering Middleware -Sorting Middleware

打开Kernel.php 添加 $routeMiddleware 数组你的中间件

   protected $routeMiddleware = [
    'website' => YourMiddlewareClass::class
   ];