php-Laravelでリクエストを投稿-エラー-419申し訳ありませんが、セッション/419ページの有効期限が切れています
Laravel5.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() }}
が含まれていることを確認してくださいあなたのフォーム
のように
LaravelのSessionExpiredまたは419PageExpiredエラーメッセージが表示されるのは、csrfトークンの検証が失敗したため、 App\Http\Middleware\VerifyCsrfToken::class
ミドルウェアがすでにオンになっていることを意味します。この形式では、 @csrf
ブレードディレクティブがすでに追加されています。これも問題ありません。
次に、チェックする他の領域はセッションです。 csrf
トークンの検証はセッションに直接関係しているため、Redisが正しく構成されていないと問題が発生する可能性があるなど、セッションドライバーが機能しているかどうかを確認することをお勧めします。< / p>
セッションドライバ/ソフトウェアを.env
fileから切り替えてみることができます。サポートされているドライバを以下に示します
Laravel 5、Laravel 6、Laravel7でサポートされているセッションドライバー (Doc Link)
file
-sessionsはstorage/framework/sessionsに保存されます。cookie
-sessionsは安全な暗号化されたcookieに保存されます。database
-sessionsはリレーショナルdatabaseに格納されます。memcached
/redis
-sessionsは、これらの高速なキャッシュベースのストアの1つに保存されます。< / li>array
-sessionsはPHParrayに保存され、永続化されません。セッションドライバーを切り替えた後にフォームが機能する場合は、その特定のドライバーに問題があります。そこからエラーを修正してみてください。
エラーが発生しやすいシナリオ
-
/storage
ディレクトリの権限の問題が原因で、おそらくfileベースのsessionsが機能しない可能性があります(すばやくグーグルすると解決策を取得してください)、ディレクトリに777を配置することは決して解決策ではないことを忘れないでください。 -
databaseドライバーの場合、DB接続が間違っているか、
sessions
テーブルが存在しないか、正しく構成されていない可能性があります( @Junaid Qadirのコメントによると、間違った構成部分が問題であることが確認されました。 -
redis / memcached
の構成が間違っているか、システム内の他のコードによって同時に操作されています。>php artisan key:generate
を実行し、新しいアプリキーを生成して、セッションデータをフラッシュすることをお勧めします。ブラウザキャッシュをクリアするハード、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
答え :
解決策:
Laravel5.7を使用しています 同じ問題が発生しました。これは、csrfトークンがフォームに含まれていなかったため、追加しました
@csrf
問題を修正しました
答え :
解決策:
セッションに問題がある可能性があります。これらの設定を試してみた後、問題を解決しました。私にとって、それは最後の選択肢であることがわかりました。
- セッションドライバとして「ファイル」を使用している場合は、 後にセッションが保存される場合は、ストレージ/フレームワーク/セッション 更新します。そうでない場合は、フォルダが正しくないことが原因である可能性があります 権限。ストレージ/フォルダに正しい権利があることを確認してください
- ページ内のすべてのJavascriptを無効にしてみてください(無効にすることによって) ナビゲーターまたはコード内で)、「http_only」であることを確認してください =>本当、
- httpsの有無にかかわらず使用してみてください
- SESSION_DRIVER変数がnullでないことを確認してください
- 「encrypt」=>falseと「encrypt」=>trueを切り替えてみてください
- Cookie名を変更してみてください'cookie'=>'laravelsession'、
- SESSION_DOMAINを実際のドメインに設定するかnullに設定してみてください
- 'secure' => env('SESSION_SECURE_COOKIE'、 false)、および'secure' => env('SESSION_SECURE_COOKIE'、true)、
答え :
解決策:
\app\Http\Kernel.php
の\App\Http\Middleware\EncryptCookies::class
をコメントアウトしてみてください
私も同様の問題を抱えており、そうすることで解決しました。
セキュリティのため、おそらく最善の解決策ではありませんが、少なくともそれは機能しました。
以前に試した:
- キャッシュをクリアする
- 新しいアプリキーを生成する
- さまざまなブラウザ(Chrome 70、Mozilla Firefox 57、IE 11)でアプリを実行します
- 別のコンピューターでアプリを実行する
\app\Http\Kernel.php
の\app\Http\Kernel.php
の- Laravelのアップグレードとダウングレード(5.6から5.7の間)
しかし、上記のどれも私にはうまくいきませんでした。
編集
ここでの私の場合は、ログインするたびに、新しいセッションファイルが作成され(古いファイルはまだ保持されていますが、突然忘れられます。
storage/framework/sessions
を確認してください)、新しいCSRFトークンが作成されます。が生成されます。したがって、問題はVerifyCsrfTokenにはありません。コメントセクションで@Vladdが言及しているように、
\App\Http\Middleware\VerifyCsrfToken::class
を絶対にコメントアウトしないでください。正しいCSRFトークンをサーバーに送信したことを確認する必要があります。
\App\Http\Middleware\VerifyCsrfToken::class
をコメントアウトします
\Illuminate\Session\Middleware\AuthenticateSession::class
をコメントアウトします
答え :
解決策:
419 |ページこのエラーは、laravelのセキュリティの問題を意味します。これは、csrfトークンフィールドが正しく使用されていないことを意味します。
{{csrf_field}}
を使用する
そしてあなたの問題は解決されます。
答え :
解決策:
次のすべての手順を実行すると、機能するはずです:
-
セッションが適切に構成されていることを確認します。最も簡単な方法は、セッションをファイルにして、ストレージフォルダーにchmod 755権限があることを確認してから、
.env
で設定します。以下のように、ファイルセッションドライバが最も簡単な設定方法です。SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
-
キャッシュフォルダがクリアされて書き込み可能であることを確認します。これは、職人のコマンドの下で実行することで実行できます。
php artisan cache:clear
-
フォルダのアクセス許可が適切に設定されていることを確認します。次のように構成する必要があります:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
フォームに
@csrf
トークンが含まれていることを確認してください。これで問題が解決することを願っています。
答え :
解決策:
welcome.blade.phpの@csrf
を<input type="hidden" name="_token" value="{{ csrf_token() }}">
コードは次のようになります:
答え :
解決策:
このエラーを解決するには、最初に次のコマンドのいずれかをフォームタグに挿入する必要があります。
@csrf
または{{ csrf_field }}
問題が解決しない場合は、次の手順を実行します:(上記のコマンドのいずれかがformタグに含まれている必要があることに注意してください)
1。次のコマンドのいずれかをフォームタグに挿入します @csrf
または{{ csrf_field }}
2. .envファイルを開き、値をSESSION_DRIVERセクションの「ファイル」に変更します。
3.次に、laravelキャッシュをリセットする必要があります。ターミナルで以下のコマンドを入力します
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4.最後のステップで、サーブからプロジェクトのプラグを抜き、phpartisanserveをもう一度クリックします
問題が解決したことを願っています
答え :
解決策:
config/sessions.phpに移動します
行を見つける
'secure' => env('SESSION_SECURE_COOKIE', true),
falseに変更
'secure' => env('SESSION_SECURE_COOKIE', false),
このパラメータがTRUEに設定されている場合、ブラウザはHTTPSプロトコルを使用する必要があります。そうでない場合、セッションは保存されません。無効なので
答え :
解決策:
コードに問題はありません。新規インストールで記述したのと同じコードで確認しました。
フォームコード:
<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;
});
ブラウザのキャッシュをクリアするか、他のブラウザで試してみると、修正されると思います。
答え :
解決策:
簡単な悪いアプローチは、app \ http \ Middleware \ verifycsrftoken.phpに移動し、$exceptリストにルートを追加することです。ポストリクエストは、CSRFトークンの検証に無視されます。
protected $except = [
//
'doLogin.aspx',
'create_coupon',
];
答え :
解決策:
久しぶりに、この方法で解決しました
私のlaravelインストールパスは、設定ファイルsession.phpで設定されたものと同じではありませんでした
'domain' => env('SESSION_DOMAIN', 'example.com'),
答え :
解決策:
ヘッダーのCSRFも更新してください
<meta name="csrf-token" content="{{ csrf_token() }}">
フォームでCSRFを更新
@CSRF
ヘッダーとフォームにすでにCSRFがある場合は、 config / session.phpに移動して更新
'domain' => env('SESSION_DOMAIN', 'example.com'),[ Only Domain name without https ]
答え :
解決策:
やり過ぎかもしれませんが、これを試すことができます:
//非表示のトークンフィールドが追加された名前付きルートを呼び出すフォーム。
<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 5.7でHomesteadを使用してローカルでテストしました。これは、Laravel Installer 2.0.1を使用した新規インストールであり、機能しました。あなたの環境は何ですか?
理論:それは、ご使用の環境での {{ }}
と{!! !!}
を使用したブレードレンダリングhtmlタグと関係があるのでしょうか。またはそれをどのように提供しているか(例: php artisan serve
)。 /vendor/laravel/framework/src/illuminate/Foundation/helpers.php
のline 335
は、上記で手動で入力した同じ行をレンダリングする必要があると思います。
答え :
解決策:
プロジェクトでコマンドラインコマンドを開きます。
1。コマンド
php artisan config:cache
2.comおよび
php artisan route:clear
答え :
解決策:
フォームに@csrf
が含まれていても、 419 pages has expired
config / session.php
のSESSION_SECURE_COOKIE
オプションをfalseに更新した後に解決しました
'secure' => env('SESSION_SECURE_COOKIE'、false)
キャッシュをクリアするより
答え :
解決策:
ここに記載されているすべての回答を試しました。しかし、それらのどれも共有ホスティングで私のために働いていませんでした。ただし、ここで言及されている魂は私にとってはうまくいきますLaravelでの「CSRFトークンの不一致」を解決する方法l
答え :
解決策:
2021、上記のすべての解決策を適用しているときにこのエラーが発生しました。すべてのルートで419がスローされていました。アプリはローカルホストでは正常に動作していましたが、サーバーでは419でした。
次に、本番環境で .env
ファイルを修正し、.envから remove sanctum variables
を修正し、{-を設定して解決策を見つけました。 config / session.php
答え :
解決策:
まったく同じ問題が発生しましたが、完全に愚かでした。フォームを送信する前に、JavaScriptを使用して(送信ボタンだけでなく)すべてのフォームフィールドを無効にしました。もちろん、これにより、すべてのフォーム要素(非表示の _token
フィールドを含む)が送信されず、419エラーが発生しました!
これが数時間の頭を掻くのに役立つことを願っています!
答え :
解決策:
Http/Kernel.php
この行にコメントしてみてください:
\Illuminate\Session\Middleware\AuthenticateSession::class,
Webミドルウェアアレイ内
問題の原因である可能性があります
答え :
解決策:
デフォルトでは、この問題は発生しませんでした。だから私がしたのはchmod -R 644 sessions
問題を再現します。
その後、 chmod -R 755 sessions
プロジェクトコードが再び機能するようになりました。
発生する理由は、書き込みが不足している状態でキャッシュをファイルに保存することです 権限。
セッション構成ファイルはconfig/session.phpに保存されます。なれ このファイルで利用可能なオプションを必ず確認してください。デフォルトでは、 Laravelはファイルセッションドライバーを使用するように構成されており、これは機能します 多くのアプリケーションに適しています。本番アプリケーションでは、次のことができます さらに高速なセッションのために、memcachedまたはredisドライバーの使用を検討してください パフォーマンス。
解決策:
1-上記で修正したように、セッションフォルダに755のアクセス許可を与えることができます。 2-別のセッションドライバ構成を使用できます。
ファイル-セッションはストレージ/フレームワーク/セッションに保存されます。クッキー - セッションは安全な暗号化されたCookieに保存されます。データベース-セッション リレーショナルデータベースに保存されます。 memcached/redis-セッションは これらの高速なキャッシュベースのストアの1つに保存されます。配列-セッションは PHP配列に格納され、永続化されません。
注意してください。 memcached / redisを使用する場合は、それらをサーバーにインストールするか、dockerredisコンテナーが実行されている必要があります。
答え :
解決策:
投稿ファイルのサイズ制限を超える大きなファイルをアップロードしようとすると、エラー419が発生することに注意してください。 この場合、upload_max_filesizeとpost_max_sizeの両方を適切な量に増やすことができます(たとえば、10Mまたは20Mは、ユースケースとリソースによって異なります)。ここを確認してください。 https://stackoverflow.com/a/2184541/2100489
ただし、これにより、帯域幅やストレージなどのリソース消費の問題が発生する可能性があります。解決策として、フォームを送信する前にファイルサイズを確認し、警告メッセージを表示することができます。
答え :
解決策:
実際、CSRFはセッションベースのトークンです。 ルートグループにルートを追加し、セッションを制御するミドルウェアを追加します。
webはlaravelのデフォルトのミドルウェアであり、セッションリクエストを制御できます。
Route::group(array('middleware' => ['web']), function () {
Route::post('/foo', function () {
echo 1;
return;
});
});
答え :
解決策:
すでにcsrfディレクティブがある場合は、セッションの実行方法を変更している可能性があります。
config/session.php
で、'secure'フィールドをチェックします。サーバーでhttpsが使用できない場合は、falseにする必要があります。
.env
ファイル(ルートディレクトリ)に SESSION_SECURE_COOKIE=FALSE
を配置することもできます。
答え :
解決策:
セッションが無効になり、ユーザーが投稿リクエストを送信しようとすると、エラーが発生します。 csrf_tokenは無効になりました。そこで、ExceptionsディレクトリのHandler.phpを変更して、このようなトークンの不一致の例外をキャッチしてみることで、これを克服しました。
レンダリング機能はこんな感じでした
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
次に、次のように変更します
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Session\TokenMismatchException){ // <<<=========== the Code
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect('/home')->with('message', 'You page session expired. Please try again');
}
return parent::render($request, $exception);
}
トークンの更新操作を処理できるルートを選択するだけです。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。