◀ 7.

Laravel No application encryption key has been specified エラー

▶
この記事の要点
  • Laravel の暗号化キー APP_KEY が設定されていないときに出るエラー
  • 原因は「.env ファイルが無い」「APP_KEY が空」「キャッシュした設定に APP_KEY が入っていない」のいずれかがほとんど
  • 対処: cp .env.example .env → php artisan key:generate → php artisan config:clear
  • git clone 直後や新しいサーバーへのデプロイ直後に起きやすい(.env は Git 管理外のため)
  • 運用中の本番で key:generate を実行し直さない。セッションや暗号化済みデータが読めなくなる

エラー内容

production.ERROR: No application encryption key has been specified.

ログファイル(storage/logs/laravel.log)や画面に表示されます。Laravel 8 以降では例外クラスは Illuminate\Encryption\MissingAppKeyException です。行頭の production は APP_ENV の値で、開発環境なら local.ERROR と表示されます。

原因

Laravel は Cookie、セッション、Crypt ファサードによる暗号化などに、.env の APP_KEY を鍵として使います。この値が取得できないと、暗号化を使う最初の処理(多くはセッション開始)でこのエラーになります。

原因よくある場面
.env ファイルそのものが無いgit clone した直後。.env は .gitignore されていてリポジトリに含まれない
.env の APP_KEY が空.env.example をコピーしただけで key:generate を実行していない
設定キャッシュに古い値が残っているAPP_KEY が空の状態で php artisan config:cache を実行した
.env の場所や権限が違う.env をプロジェクトルート以外に置いた、Web サーバーのユーザーが読めない
環境変数が渡っていないDocker やクラウドで .env を使わず環境変数で設定する構成なのに、APP_KEY を設定し忘れた

対処法

1. .env ファイルを作成する

プロジェクトのルートディレクトリ(artisan ファイルがある場所)で、.env.example をコピーして .env を作ります。

# Linux / macOS / Git Bash
cp .env.example .env

# Windows コマンドプロンプト
copy .env.example .env

2. APP_KEY を生成する

キーを生成するには、以下のコマンドを実行します。.env の APP_KEY= の行に base64: で始まるランダムな値が書き込まれます。

php artisan key:generate

新しい Laravel では、.env に APP_KEY= の行自体が無いと「Unable to set application key. No APP_KEY variable was found in the .env file.」というエラーで止まります。その場合は .env に空の APP_KEY= 行を追加してから再実行します。

3. 設定キャッシュを作り直す

過去に config:cache を実行している環境では、.env を直してもキャッシュの値が優先されます。キャッシュを消すか、作り直します。

php artisan config:clear
# 本番では、.env が正しいことを確認してから再度キャッシュする
php artisan config:cache

php-fpm、キューワーカー(php artisan queue:work)、Octane など常駐プロセスを使っている場合は、それらも再起動します。

4. 環境変数で渡す構成の場合

Docker や PaaS で .env を置かない構成では、php artisan key:generate --show でキーを表示だけさせ(ファイルは書き換えない)、その値をコンテナやサービスの環境変数 APP_KEY に設定します。キーはパスワードと同じ扱いで、リポジトリやログに残さないようにします。

注意: 本番で key:generate をやり直さない

APP_KEY を変えると、それまでの鍵で暗号化されたものがすべて復号できなくなります。

  • ログイン中のユーザーのセッションや「ログイン状態を保持」の Cookie が無効になり、全員がログアウトされる
  • Crypt::encryptString() や Eloquent の encrypted キャストで保存したデータが読めなくなる(DecryptException)
  • 署名付き URL(パスワードリセットのリンクなど)が無効になる

このエラーが出ているということは「キーが読めていない」だけで、元のキーがどこかに保存されていることもあります。運用中のサーバーでは、新しいキーを作る前にバックアップや旧サーバーの .env、シークレット管理サービスに元の APP_KEY が残っていないかを確認してください。どうしてもキーを入れ替える場合、Laravel 11 以降では古いキーを APP_PREVIOUS_KEYS に書いておくと、古いキーで暗号化されたデータも復号できます。

確認方法

# .env に値が入っているか
grep APP_KEY .env

# Laravel が実際に読み込んでいる値(空でなければ OK)
php artisan tinker --execute="echo config('app.key') ? 'set' : 'empty';"

# 設定キャッシュの有無を含めた環境の概要
php artisan about

php artisan about の Cache 欄で Config が CACHED になっていれば、キャッシュの値が使われています。最後にブラウザでページを開き、エラーが出ないことを確認します。

初回セットアップの手順まとめ

Git からプロジェクトを取得して動かすときは、次の順で実行すればこのエラーを避けられます。composer create-project で新規作成した場合は、.env の作成と key:generate は自動で行われます。

  1. composer install
  2. cp .env.example .env して DB などの値を編集
  3. php artisan key:generate
  4. php artisan migrate など、必要な初期化

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost'
  2. Add [~] to fillable property to allow mass assignment on [App\~].
  3. PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in ~
  4. Changing columns for table "~" requires Doctrine DBAL; install "doctrine/dbal"
  5. MethodNotAllowedHttpException No message
  6. Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
  7. production.ERROR: No application encryption key has been specified.
  8. Dotenv values containing spaces must be surrounded by quotes.
  9. Laravel \ Socialite \ Two \ InvalidStateException
  10. The page has expired due to inactivity. Please refresh and try again.
  11. Failed to clone https://github.com/symfony/thanks.git via https, ssh protocol
  12. Illegal offset type
  13. Cannot access protected property Illuminate\Http\Request::$...
  14. Emitted value instead of an instance of Error
  15. 画像保存時にInternal Server Error
  16. Failed to authenticate on SMTP server with username ...
  17. PostTooLargeException
  18. Database hosts array is empty.
  19. Invalid request (Unsupported SSL request)
  20. does not comply with psr-4 autoloading standard. Skipping.
  21. MySQLのSTR_TO_DATE関数を使用するとnullが返却される問題