Laravel 7.xから8.xに更新して変わったことを紹介していきます。最初は、メンテナンスモードに関して。

Laravel 7.xのメンテナンスモードに関して書いたのは、たった1年前のことです。
メンテナンス画面:php artisan up & downでは、

Laravelの経験が長くなると、つまり初期のバージョンから使用していると、昔のやり方しか知らずに過ごしていることがあります。… ということでやり方学びなおします

なんて書いていましたが、Laravel 8.xの更新でまたもや学びなおしです。

php artisan downのコマンドはそのままですが、それに追加するオプションが変わりました。

まず、比較してみましょう。

Laravel 7.xにおいて、

$ php artisan down --help

を実行すると、以下のようのなオプションがあります。英語のヘルプは日本語に私が訳しています。

Usage:
  down [options]

Options:
      --message[=MESSAGE]  メンテナンス画面に表示するメッセージ
      --retry[=RETRY]      HTTPヘッダーのRetry-Afterの秒数を設定
      --allow[=ALLOW]      メンテナンスモードでもアクセスできるIPアドレスを指定

同じコマンドラインをLaravel 8.xで実行すると、

Usage:
  down [options]

Options:
      --redirect[=REDIRECT]  メンテナンス中は指定のURLに皆リダイレクト<strong>
      --render[=RENDER]      メンテナンス中に表示する画面を指定
      --retry[=RETRY]        HTTPヘッダーのRetry-Afterの秒数を設定
      --refresh[=REFRESH]    HTTPヘッダーのRefreshの秒数を設定
      --secret[=SECRET]      メンテンナンスをバイパスするシークレットコードを指定
      --status[=STATUS]      メンテナンス中に返すHTTPのステータスコードを指定(デフォルト503)

オプションの数が増えただけでなく、–messageとか–allowとかが無くなってしまいました。

これは問題です。 –allowなしにどうやって開発者あるいは関係者だけがメンテナンス中のサイトにアクセスできるのでしょうか?

Laravel 8.xはそれを、–secretのオプションで解決します。実行は、例えば

$ php artisan down --secret=secret-code

としてメンテンナンスに入り、ブラウザーで以下のURLでアクセスすると、あたかもメンテナンスなしの状態で画面にアクセスできます。

https://example.com/secret-code

これはとても素晴らしいです。今まで自宅のIPが変わったりしていちいち調べて–allowにIPアドレスを指定していましたが、その必要がなくなります。

仕組みとしては、いたって簡単で上のようにシークレットコードでアクセスしたら、larave_maintenanceというクッキーにその値を暗号化して入れて、それが正しいかをチェックしているようです。

もちろん、先の例のようにsecret-codeではあまりにも簡単すぎるので実際には以下のようにtinkerで値を作成することを勧めます。

>>> Str::random()
=> "mdcSOnkB5fT2rGAC"
>>> (string) Str::uuid()
=> "fe3a8010-bdda-4972-a0bb-ab96c17841a6"
>>>

By khino