Laravel 特定子域的维护模式

Laravel maintenance mode on specific subdomain

我知道你可以排除主应用程序的一些 URI,比如如果你想排除 example.com/page,你只需将它添加到 CheckForMaintenanceMode.php,就像这样:

app/Http/Middleware/CheckForMaintenanceMode.php

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;

class CheckForMaintenanceMode extends Middleware
{
    /**
     * The URIs that should be reachable while maintenance mode is enabled.
     *
     * @var array
     */
    protected $except = [
        '/page'
    ];
}

现在,我的应用程序有几个使用一个应用程序的子域;我的主要应用程序有一个子域:app.example.com,我的 API 端点的子域:api.example.com 和主要网站:www.example.com

我怎么可能 except 维护模式的特定子域而不是 URI?就像 api.example.comapp.example.com 处于维护模式但不是主要网站 www.example.com?

我正在尝试自己弄清楚它,甚至制作我自己的中间件只是为了做到这一点,但是是否可以使用 laravel 的内置维护模式和 php artisan:down?

类似于:

// app.example.com and api.example.com is in maintenance mode except:

protected $except = [
    'example.com'
    'www.example.com'
];

查看 Illuminate\Foundation\Http\Middleware\CheckMaintenanceMode 中间件 class:

它使用 Illuminate\Http\Request class 中的函数 fullUrlIs() 检查 $except 属性 的元素,它本身调用 Str::is() 助手(如果您使用 Laravel 助手函数全局变量,也称为 str_is() 函数):

protected function inExceptArray($request)
    {
        foreach ($this->except as $except) {
            if ($except !== '/') {
                $except = trim($except, '/');
            }

            if ($request->fullUrlIs($except) || $request->is($except)) {
                return true;
            }
        }

        return false;
    }

https://laravel.com/docs/7.x/helpers#method-str-is

然后您应该能够像这样检查 url,以将此域从维护模式中排除(即它将始终运行):

protected $except = [
    'https://www.example.com/*'
];

假设您有两个域。一个是主域 另一个是子域。

  • mydomain.com
  • admin.mydomain.com

您有一个页面名称维护。维护页面在主域下。维护页面的URL是mydomain.com/maintenance。 在维护模式下,你将拥有mydomain.com/maintenance和admin.mydomain.com

的路由权限

现在工作流程。 转到 App\Http\Middleware 打开 PreventRequestsDuringMaintenance 中间件然后添加此代码

protected $except = [
   'maintenance*',
   'http://admin.*',
   'https://admin.*'
];

然后去App\Exceptions打开Handler文件,在渲染函数里面添加

if (App::isDownForMaintenance()) {
   return redirect('/maintenance');
}

现在运行php artisan down