Instalé Laravel 5.7
Se agregó un formulario al archivo. \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Agregado al archivo \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
Después de enviar una solicitud POST:
419 Lo sentimos, su sesión ha expirado. Por favor, actualice y pruebe de nuevo.
En la versión 5.6
no hubo tal problema.
return;
puede llamarreturn redirect()->back();
. Por lo que puedo ver, la aplicación no tiene nada que hacer después de la solicitud de publicación. Tal vez pueda redirigirlo a una vista después de procesar la solicitud.file
paraSESSION_DRIVER
en.env
que trabaja muy bien. ¿Por qué no funciona la sesión basada en la base de datos?vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
línea de archivo 67 para saber por quésessions
mesa para un propósito diferente. Después de cambiar el nombre de esta tabla por uno más adecuado y ejecutarartisan session:table
y actualizar la migración, todo funciona bienRespuestas:
Antes de leer a continuación, asegúrese de tener
@csrf
o{{ csrf_field() }}
en su forma como<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
Aparece el mensaje de error Session Expired o 419 Page Expired en larvel porque en algún lugar falla la verificación del token csrf, lo que significa que el
App\Http\Middleware\VerifyCsrfToken::class
middleware ya está encendido. En la forma en que@csrf
ya se agregó la directiva Blade, lo que también debería estar bien.Entonces, la otra área a verificar es la sesión. La
csrf
verificación del token está directamente relacionada con su sesión, por lo que es posible que desee verificar si el controlador de su sesión está funcionando o no, por ejemplo, un Redis configurado incorrectamente podría causar un problema.Tal vez pueda intentar cambiar su controlador / software de sesión desde su
.env
archivo, los controladores compatibles se proporcionan a continuaciónControladores de sesión compatibles en Laravel 5, Laravel 6 y Laravel 7 (Doc Link)
file
- las sesiones se almacenan en almacenamiento / marco / sesiones.cookie
- las sesiones se almacenan en cookies seguras y cifradas.database
- las sesiones se almacenan en una base de datos relacional.memcached
/redis
- las sesiones se almacenan en uno de estos almacenes rápidos basados en caché.array
- las sesiones se almacenan en una matriz PHP y no se conservarán.Si su formulario funciona después de cambiar el controlador de sesión, entonces algo está mal con ese controlador en particular, intente corregir el error desde allí.
Posibles escenarios propensos a errores
Es posible que las sesiones basadas en archivos no funcionen debido a los problemas de permisos con el
/storage
directorio (una búsqueda rápida en Google te traerá la solución), también recuerda que poner 777 para el directorio nunca es la solución.En el caso del controlador de la base de datos, es posible que su conexión de base de datos sea incorrecta, o que la
sessions
tabla no exista o esté mal configurada (se confirmó que la parte de configuración incorrecta es un problema según el comentario de @Junaid Qadir).redis/memcached
La configuración es incorrecta o está siendo manipulada por algún otro código en el sistema al mismo tiempo.Puede ser una buena idea ejecutar
php artisan key:generate
y generar una nueva clave de aplicación que, a su vez, eliminará los datos de la sesión.Clear Browser Cache HARD , encontré que Chrome y Firefox son los culpables más de lo que puedo recordar.
Obtenga más información sobre por qué son importantes las claves de la aplicación
fuente
_token
valor recibido del FORMULARIO. Evite el usoSESSION_DOMAIN=...
con IP que Chrome y las especificaciones de cookies HTTP consideren inseguras.419 Page Expired
aparece. En aras de la usabilidad, ¿cómo le dices a un simple usuario lo que acaba de suceder y cómo solucionarlo?Esto se debe a que el formulario requiere un csrf. En la versión 5.7, lo cambiaron a @csrf
<form action="" method="post"> @csrf ...
Referene: https://laravel.com/docs/5.7/csrf
fuente
csrf
campo, solo miré en el historial de edicionesentonces
agregue
SESSION_DOMAIN=
su archivo .envo en su config / session.php
'domain' => env('SESSION_DOMAIN', ''),
y luego corre
php artisan cache:clear
agregue
SESSION_DOMAIN=mydomain.com
su archivo .envo en su config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
y luego corre
php artisan cache:clear
fuente
¿Qué tal usar
{{ csrf_field() }}
en vez de@csrf
El error 419 se debe principalmente a problemas con el token csrf.
fuente
{{ csrf_field() }}
?Utilizo Laravel 5.7 Tuve el mismo problema y fue porque el token csrf no estaba en el formulario, así que agregando
solucionó el problema
fuente
Intente comentar
\App\Http\Middleware\EncryptCookies::class
en\app\Http\Kernel.php
Tengo un problema similar y lo resolví haciéndolo. Probablemente no sea la mejor solución por la seguridad, pero al menos funcionó.Anteriormente intenté:
\App\Http\Middleware\VerifyCsrfToken::class
en\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
en\app\Http\Kernel.php
Pero ninguno de los anteriores funcionó para mí.
EDITAR
Mi caso aquí es que cada vez que inicie sesión, se creará un nuevo archivo de sesión (el anterior aún persiste, pero de repente se olvida. Verifique
storage/framework/sessions
) y se genera un nuevo token CSRF. Entonces, el problema no está con VerifyCsrfToken.Como mencionó @Vladd en la sección de comentarios, nunca debe comentar
\App\Http\Middleware\VerifyCsrfToken::class
. Debe verificar que envió el TOKEN CSRF correcto al servidor.fuente
cambia tu
@csrf
en welcome.blade.php a<input type="hidden" name="_token" value="{{ csrf_token() }}">
entonces tu código como este:
<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>
fuente
Podría ser un problema con su sesión. Después de jugar con esta configuración, resolví mi problema. Para mí resultó ser la última opción.
Fuente: Laravel Session siempre cambia cada actualización / solicitud en Laravel 5.4
fuente
SESSION_SECURE_COOKIE
interruptor (lo cambió afalse
) lo hizo por mí. (enlocalhost:8000
agregue el token csrf y su problema se resolverá. {{csrf_token}} o @csrf
fuente
Para resolver este error, primero debe insertar uno de los siguientes comandos en la etiqueta del formulario.
@csrf
O{{ csrf_field }}
Si su problema no se resuelve, haga lo siguiente: (Tenga en cuenta que uno de los comandos anteriores debe estar en la etiqueta del formulario)
1.Inserte uno de los siguientes comandos en la etiqueta del formulario
@csrf
O{{ csrf_field }}
2. Abra el archivo .env y cambie los valores al "archivo" en la sección SESSION_DRIVER.
3.Entonces debes restablecer la caché de laravel. escriba los siguientes comandos en la terminal
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4.En el paso final, desconecte el proyecto del servicio y haga clic nuevamente en php artisan serve
Espero que tu problema este resuelto
fuente
Después de tanto tiempo lo resolví de esta manera
Mi ruta de instalación de laravel no era la misma que la configurada en el archivo de configuración session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
fuente
Puede ser exagerado, pero puedes probar esto:
// Formulario que llama a la ruta nombrada con un campo de token oculto agregado.
<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>
// Ruta nombrada
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Agrega esto dentro del
<head></head>
bloque:<meta name="_token" content="{!! csrf_token() !!}" />
Lo probé en mi local usando Homestead en Laravel 5.7, que fue una instalación nueva usando Laravel Installer 2.0.1 y funcionó. ¿Cuál es tu entorno?
Teoría: Me pregunto si eso tiene algo que ver con la renderización de etiquetas html de Blade
{{ }}
vs.{!! !!}
en su entorno o cómo lo está sirviendo (por ejemplophp artisan serve
). Lo que me hace pensar que esline 335
de/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
debe dar la misma línea escrita manualmente anteriormente.fuente
<meta>
etiquetas deben colocarse dentro del<head>
, no dentro del<body>
. No estoy seguro de que al validador de HTML le guste esto.No hay ningún problema en el código. He verificado con el mismo código que ha escrito con la nueva instalación.
Código de formulario:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
código de archivo:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
El resultado después de enviar el formulario es:
Si borras la memoria caché de tu navegador o lo intentas con otro navegador, creo que se solucionará.
fuente
Un mal enfoque rápido es ir a app \ http \ middleware \ verifycsrftoken.php y agregar la ruta en $ except list. La solicitud de publicación se ignorará para la verificación del token CSRF.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
fuente
419 | página este error significa un problema de seguridad de laravel significa que el campo de token csrf no se usa correctamente.
use
{{csrf_field}}
y su problema será resuelto.fuente
Debería funcionar si prueba todos estos pasos:
Asegúrese de que su sesión esté bien configurada, la forma más fácil es convertirla en un archivo y asegurarse de que la carpeta de almacenamiento tenga el permiso chmod 755, luego, en su
.env
configuración, como se muestra a continuación, el controlador de sesión de archivo es la forma más fácil de configurar.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Asegúrese de que la carpeta Cache esté limpia y se pueda escribir, puede hacerlo ejecutando el comando artisan debajo.
Asegúrese de que los permisos de la carpeta estén bien establecidos, deben configurarse como se muestra a continuación:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Asegúrese de que su formulario tenga el
@csrf
token incluido.Espero que esto resuelva su problema.
fuente
En tus
Http/Kernel.php
intenta comentar esta línea:
\Illuminate\Session\Middleware\AuthenticateSession::class,
en su matriz de middleware web
podría ser la raíz de tu problema
fuente
Por defecto no tuve este problema. Entonces, lo que hice fue
chmod -R 644 sessions
replicar el problema.Luego di permisos a la carpeta de sesiones por
chmod -R 755 sessions
ahora mi código de proyecto funciona de nuevo.
La razón por la que sucede es que almacena su caché en un archivo sin permisos de escritura.
Soluciones:
1 - Como he solucionado anteriormente, puede otorgar 755 permisos a la carpeta de sesiones. 2 - Puede utilizar otra configuración de controlador de sesión.
Tener en cuenta; Si desea utilizar memcached / redis, debe tenerlos instalados en su servidor o su contenedor docker redis debe estar ejecutándose.
fuente
En realidad, CSRF es un token basado en sesiones. Agregue su ruta en un grupo de rutas y agregue un middleware que controle las sesiones.
web es un middleware predeterminado en laravel y puede controlar las solicitudes de sesión.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
fuente
Si ya tiene la directiva csrf , es posible que haya cambiado la forma en que se ejecutan las sesiones.
En
config/session.php
, marque el campo 'seguro' . Debería estar en falso si https no está disponible en su servidor.También puede poner
SESSION_SECURE_COOKIE=FALSE
en su.env
archivo (directorio raíz).fuente
abra la línea de comando cmd en su proyecto.
1.comando
2.com y
fuente
¿También tiene el csrf en el encabezado de su aplicación?
<meta name="csrf-token" content="{{ csrf_token() }}">
fuente
Si bien el formulario tiene
@csrf
, todavía muestra419 pages has expired
Lo resolví después de la
SESSION_SECURE_COOKIE
opción de actualización a falso en config / session.php'secure' => env('SESSION_SECURE_COOKIE', false)
que borrar caché
fuente
Vaya a config / sessions.php
encuentra la fila
'secure' => env('SESSION_SECURE_COOKIE', true),
cámbialo a falso
'secure' => env('SESSION_SECURE_COOKIE', false),
Si este parámetro se establece en TRUE, el navegador requerirá que use el protocolo HTTPS; de lo contrario, no almacenará la sesión. Como no es valido
fuente
Acabo de pasar por todo esto y estoy aquí esperando una respuesta ... En mi caso, la solución fue borrar el historial del navegador.
fuente
En mi caso fue un?> Al final de las rutas.php. Pasé mucho tiempo allí ...
fuente
?>
al final deweb.php
Simplemente tuve exactamente el mismo problema y se debía a que yo era completamente estúpido. ¡Había deshabilitado todos los campos del formulario (en lugar de solo el botón de envío) a través de javascript antes de enviar dicho formulario! Esto, por supuesto, dio como resultado que no se enviaran todos los elementos del formulario (incluido el
_token
campo oculto ), lo que a su vez generó el error 419.¡Espero que esto ayude a alguien de unas horas de rascarse la cabeza!
Las entradas de formulario deshabilitadas no aparecen en la solicitud
fuente
Tengo este problema hace mucho tiempo. Recordé que causa permiso de
storage/framework/sessions
. Es posible que desee cambiarlo mediante unchmod -R 0777 storage/framework/sessions
comando. Funcionó para mí.fuente
En mi caso, es muy ridículo. Recibo el error 419 cuando lo coloco
Auth::routes()
en la parte superior del archivo de ruta.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
Y arreglé el error moviéndome
Auth::routes();
al final del archivo de ruta.Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Quizás también pueda ayudar en su caso. Buena suerte.
fuente
Tenga en cuenta que recibe el error 419 si está intentando cargar un archivo grande que excede el límite de tamaño del archivo de publicación. En este caso, puede aumentar tanto upload_max_filesize como post_max_size a una cantidad razonable (por ejemplo, 10M o 20M depende de su caso de uso y recursos), consulte aquí: https://stackoverflow.com/a/2184541/2100489
Pero esto puede causar problemas de consumo de recursos, por ejemplo, ancho de banda y almacenamiento. Como solución, puede verificar el tamaño del archivo antes de enviar el formulario y mostrar un mensaje de advertencia.
fuente