419 Page Expired とLaravelでフォーム送信時に出た時の対処法

更新日:

Laravelでブレードにフォームを作成し、いざ送信ボタンを押したら、

419 Page Expired と出ませんでしたか?

 

原因は

 

  • フォームに @csrf を入れ忘れている
  • 画像送信フォームにenctype="multipart/form-data"が入ってない
  • requestのauthorizeがfalseになっている
  • キャッシュが邪魔をしている

のどれかの可能性が高いです。

 

419 Page Expiredの原因1:@csrfを入れ忘れている

Laravel(5.6以降、6、7、8など)では、フォームをブレード上に作成した場合、必ず、

この画像のように、<form>~</form>の間に@csrfと記述する必要があります。

 

もし、Laravel5.5かそれ以前の場合は、

{{ csrf_field() }}

と代わりに書く必要があります。

 

これは、Cross Site Request Forgery(クロスサイトリクエストフォージェリ)という不正なフォーム送信(なりすまし送信、ハッキング)を防ぐためのタグです。

 

これを付け忘れてると、419 Page Expired になります。

419 Page Expiredの原因2:ファイル送信フォームにenctype="multipart/form-data"が入ってない

もしくは、もしあなたのフォームに画像や音声などのファイルをアップロードするボタンが付いてる場合は、<form>にenctype="multipart/form-data"という記述がないと、419 Page Expiredと出てアップロードできないようになってます。

図のように、<form>タグ内に、enctype="multipart/form-data"と足す事で、419 Page Expiredと出ずにファイルアップロードができるようになるはずです。

 

419 Page Expiredの原因3:Requestのauthorizeがfalseになっている

さらにもしあなたが、バリデーションを使ってる場合は、バリデーションが書かれているRequest.phpが原因かもしれません。

例えば、下図のように、コントローラーにContactRequestというバリデーションファイルを使ってる場合は、

app\Http\RequestsフォルダのContactRequest.phpを開きます。

開くと、public funciton authorize()というメソッドがあり、

もしそこがreturn falseになってる場合は、419 Page Expiredに必ずなります。
なぜなら、falseという事はフォーム自体が送れないようになってるからです。

なので、return false; を return true; に書き換えて、上書き保存する事で、419 Page Expiredが出なくなるはずです。

 

バリデーションについてはこの記事で詳しく解説してるよ↓

Laravel6チュートリアル:バリデーション(入力禁止文字)をフォームに実装しよう!

 

419 Page Expiredの原因4:キャッシュが邪魔をしている

全部直したのに、419 Page Expired が直らないんだけど(泣)

まず、文字や@が日本語入力の全角英語になってしまってないかチェックして。

 

もしくは、キャッシュが残ってしまってる可能性があるから、
そんな時はコマンドプロンプト(Shell/ターミナル)を開いて、
cdでLaravelプロジェクトフォルダに移動した後、

php artisan config:cacheと入力、Enterして、
ブラウザをCtrl + F5で更新して試してみて。

 

それでダメなら、

php artisan route:clear

php artisan view:clear

composer dump-autoload -o

などを同じように試してみるのもあり。

そして、ブラウザをctrl+F5で更新すると直ったりするよ。

Neby

 

写真で血圧記録

  • この記事を書いた人

Neby

本を毎日多読しつつ、資産運用、プログラミング、心理学、ネットビジネススキルを猛向上中。貧富の差が広がる5年後、10年後に安心生活を送るためのお金のリテラシー、スキル、資産を一緒に作っていきましょう。

-PHP Laravel入門