Laravel 5.7をインストールしました
ファイルにフォームを追加しました\resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
ファイル\routes\web.php
に追加しました
Route::post('/foo', function () {
echo 1;
return;
});
POSTリクエストを送信した後:
419申し訳ありませんが、セッションの有効期限が切れています。更新してもう一度お試しください。
バージョン5.6
では、そのような問題はありませんでした。
以下を読む前に、フォームに@csrf
または{{ csrf_field() }}
があることを確認してください
<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>
セッション期限切れエラーメッセージが表示されるのは、csrfトークンの検証がどこかで失敗したためです。つまり、App\Http\Middleware\VerifyCsrfToken::class
ミドルウェアがすでにオンになっています。フォームには@csrf
ブレードディレクティブが既に追加されていますが、これでも問題ありません。
次に、確認する他の領域はセッションです。 csrf
トークンの検証はセッションに直接関係するため、不適切に構成されたRedisが問題を引き起こす可能性があるなど、セッションドライバーが機能しているかどうかを確認することをお勧めします。
セッションドライバー/ソフトウェアを.env
ファイルから切り替えてみることもできます。サポートされているドライバーは以下のとおりです
Laravel 5.7でサポートされているセッションドライバ (Doc Link)
file
-セッションはstorage/framework/sessionsに保存されます。cookie
-セッションは、暗号化された安全なCookieに保存されます。database
-セッションはリレーショナルデータベースに保存されます。memcached
/redis
-セッションは、これらの高速なキャッシュベースのストアのいずれかに保存されます。array
-セッションはPHP配列に保存され、永続化されません。セッションドライバーを切り替えた後、フォームが機能する場合は、その特定のドライバーに何か問題があります。そこからエラーを修正してください。
エラーが発生しやすいシナリオ
おそらく/storage
ディレクトリのアクセス許可の問題のため、ファイルベースのセッションが機能しない可能性があります(クイックグーグルで解決策を取得します)
データベースドライバーの場合、DB接続が間違っているか、sessions
テーブルが存在しないか、正しく構成されていない可能性があります(@Junaid Qadirのコメントにより、誤った構成部分が問題であることが確認されました)。
redis/memcached
設定が間違っているか、システム内の他のコードによって同時に操作されています。php artisan key:generate
を実行し、セッションデータをフラッシュする新しいアプリキーを生成することをお勧めします。
ブラウザのキャッシュをクリアHARD、chromeとfirefoxが原因であることがわかりました。
これは、フォームにcsrfが必要なためです。バージョン5.7では、@ csrfに変更しました
<form action="" method="post">
@csrf
...
ケース1:127.0.01:8000のようなローカルシステムでプロジェクトを実行している場合、
それから
.envファイルにSESSION_DOMAIN=
を追加します
またはconfig/session.php 'domain' => env('SESSION_DOMAIN', ''),
で
php artisan cache:clear
を実行します
ケース2:プロジェクトがサーバーで実行されており、「mydomain.com」のようなドメインがある場合
.envファイルにSESSION_DOMAIN=mydomain.com
を追加します
またはconfig/session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
で
php artisan cache:clear
を実行します
Laravelを使用します5.7同じ問題が発生しました。csrfトークンがフォームになかったためです。
@csrf
問題を修正しました
使い方はどうですか
@csrf
の代わりに{{ csrf_field() }}
419エラーのほとんどは、csrfトークンの問題が原因です。
\App\Http\Middleware\EncryptCookies::class
の\app\Http\Kernel.php
をコメントアウトしてみてください。同様の問題があり、そうすることで解決しました。おそらくセキュリティが機能するため、最良のソリューションではありません。
以前私が試した:
\App\Http\Middleware\VerifyCsrfToken::class
の\app\Http\Kernel.php
をコメントアウトします\Illuminate\Session\Middleware\AuthenticateSession::class
の\app\Http\Kernel.php
をコメントアウトしますしかし、上記のどれも私にとってはうまくいきませんでした。
編集
ここでの私の場合は、ログインするたびに新しいセッションファイルが作成され(古いセッションファイルはまだ残っていますが、突然忘れられます。storage/framework/sessions
を確認してください)、新しいCSRFトークンが生成されます。したがって、問題はVerifyCsrfTokenにはありません。
@Vladdがコメントセクションで言及したように、決してコメント\App\Http\Middleware\VerifyCsrfToken::class
する必要があります。正しいCSRFトークンをサーバーに送信したことを確認する必要があります。
welcome.blade.phpの@csrf
を<input type="hidden" name="_token" value="{{ csrf_token() }}">
に変更します
あなたのコードは次のようになります:
<form method="POST" action="/foo" >
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
<button type="submit">Submit</button>
</form>
あなたのHttp/Kernel.php
この行をコメントしてみてください:
\Illuminate\Session\Middleware\AuthenticateSession::class,
webミドルウェアアレイ内
それはあなたの問題の根本かもしれません
かなりの時間の後、私はそれをこのように解決しました
laravelインストールパスは、設定ファイルsession.phpで設定されたものと同じではありませんでした
'domain' => env('SESSION_DOMAIN', 'example.com'),
コードに問題はありません。新規インストールで作成したコードと同じコードで確認しました。
フォームコード:
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
web.php
ファイルコード:
Route::get('/', function () {
return view('welcome');
});
Route::post('/foo', function () {
echo 1;
return;
});
ブラウザのキャッシュをクリアするか、他のブラウザで試してみると、修正されると思います。
デフォルトでは、この問題はありませんでした。したがって、私がしたことは、問題を再現するためのchmod -R 644 sessions
です。
その後、chmod -R 755 sessions
によってセッションフォルダーにアクセス許可を付与しました
今、私のプロジェクトコードは再び動作します。
書き込み権限のないファイルにキャッシュを保存していることが原因です。
セッション構成ファイルはconfig/session.phpに保存されます。このファイルで使用可能なオプションを必ず確認してください。デフォルトでは、Laravelはファイルセッションドライバーを使用するように設定されており、多くのアプリケーションでうまく機能します。本番アプリケーションでは、セッションのパフォーマンスをさらに高速化するために、memcachedまたはredisドライバーの使用を検討できます。
ソリューション:
1-上記で修正したように、セッションフォルダーに755の許可を与えることができます。 2-別のセッションドライバー構成を使用できます。
ファイル-セッションはstorage/framework/sessionsに保存されます。 cookie-セッションは安全な暗号化されたcookieに保存されます。データベース-セッションはリレーショナルデータベースに保存されます。 memcached/redis-セッションは、これらの高速なキャッシュベースのストアのいずれかに保存されます。配列-セッションはPHP配列に格納され、永続化されません。
覚えておいてください。 memcached/redisを使用する場合は、サーバーにインストールするか、docker redisコンテナーが実行されている必要があります。
私はまったく同じ問題を抱えていたが、それは完全に愚かであることにかかっていた。上記のフォームを送信する前に、javascriptを介して(送信ボタンだけでなく)すべてのフォームフィールドを無効にしました。これにより、当然、すべてのフォーム要素が送信されず(非表示の_token
フィールドを含む)、419エラーが発生しました。
これが、数時間の頭の傷から誰かを助けることを願っています!
私の場合、それは非常にばかげています。 Auth::routes()
をルートファイルの先頭に配置すると、エラー419が発生します。
Auth::routes();
Route::middleware('auth')->group(function () {
Route::get('/', 'DashboardController@index')->name('dashboard');
});
そして、Auth::routes();
をルートファイルの一番下に移動してエラーを修正しました。
Route::middleware('auth')->group(function () {
Route::get('/', 'DashboardController@index')->name('dashboard');
});
Auth::routes();
おそらくあなたのケースにも役立つかもしれません。幸運を。
Laravel 5.6以降で空のリターンを行うことはできません。 Laravelは常に値が返されることを想定しています。 (私は過去の経験から知っています)。これは主に、PHP 7が空の戻り値を処理する方法に関係しています。
やり過ぎかもしれませんが、これを試すことができます:
//フォーム呼び出し名前付き隠されたトークンフィールドが追加されたルート。
<form method="POST" action="{{ route('foo') }}" >
@csrf
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
// 名前付きルート
Route::post('/foo', function () {
return 'bar';
})->name('foo');
// <head></head>
ブロック内にこれを追加します:
<meta name="_token" content="{!! csrf_token() !!}" />
Laravelインストーラー2.0.1を使用して新規インストールされたLaravel 5.7でHomesteadを使用してローカルでテストし、機能しました。あなたの環境は何ですか?
理論:それは、あなたの環境で{{ }}
vs. {!! !!}
を使用してhtmlタグをレンダリングするブレードと関係があるのか、それをどのように提供しているのか(たとえばphp artisan serve
)。それがline 335
of /vendor/laravel/framework/src/illuminate/Foundation/helpers.php
であると私に思わせるのは、上記で手動で入力した同じ行をレンダリングするべきです。
私はずっと前にこの問題を見つけました。 storage/framework/sessions
の許可を引き起こすことを思い出しました。 chmod -R 0777 storage/framework/sessions
コマンドで変更することもできます。それは私のために働いた。
投稿ファイルのサイズ制限を超える大きなファイルをアップロードしようとすると、エラー419が表示されることに注意してください。この場合、upload_max_filesizeとpost_max_sizeの両方を妥当な量に増やすことができます(たとえば、10Mまたは20Mはユースケースとリソースに依存します)。ここでチェックしてください: https://stackoverflow.com/a/2184541/2100489
ただし、これにより、帯域幅やストレージなどのリソース消費の問題が発生する可能性があります。解決策として、フォームを送信する前にファイルサイズを確認し、警告メッセージを表示できます。
それをそこに出すために、私は同じ問題を抱えていました。私のローカルのホームステッドでは、期待どおりに動作しますが、開発サーバーにプッシュした後、セッションタイムアウトメッセージも取得しました。環境の問題を考えると、Apacheからnginxに変更され、奇跡的に問題がなくなりました。
実際、SCRFはセッションベースのトークンです。ルートグループにルートを追加し、セッションを制御するミドルウェアを追加します。
webはlaravelのデフォルトのミドルウェアであり、セッションリクエストを制御できます。
Route::group(array('middleware' => ['web']), function () {
Route::post('/foo', function () {
echo 1;
return;
});
});
手っ取り早いアプローチは、app\http\middleware\verifycsrftoken.phpに移動し、$ exceptリストにルートを追加することです。ポストリクエストは、CSRFトークンの検証に適しています。
protected $except = [
//
'doLogin.aspx',
'create_coupon',
];