我是Laravel的新手, 我有一个Laravel 6的应用程序, 但它的会话并不像预期的那样. 每次我提交表单的时候都会出现419 - 页面过期的错误.
@csrf
每一个表单都包含了session, 所以这不是问题所在.
相反, 我看到的是 浏览器中既没有设置Session cookie,也没有设置XSRF-TOKEN cookie。. 然而,我确实看到每次加载页面时,会话都会在数据库中创建一个新的ID。
sessions.php配置文件是默认的。
'driver' => env('SESSION_DRIVER', 'file'),
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => env('SESSION_CONNECTION', null),
'table' => 'sessions',
'store' => env('SESSION_STORE', null),
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'path' => '/',
'domain' => env('SESSION_DOMAIN', null),
'secure' => env('SESSION_SECURE_COOKIE', false),
'http_only' => true,
'same_site' => null,
VerifyCsrfToken.php中间件文件是默认的:
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
*
* @var bool
*/
protected $addHttpCookie = true;
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
}
我在.env中修改的唯一会话变量是:
SESSION_DRIVER=database
SESSION_COOKIE=lsession
SESSION_LIFETIME=43200
除了确认 @crsf
token包含在每一个表单中,我已经尝试过了。
php artisan cache:clear && php artisan config:cache
都不行。
还有什么原因会导致sessioncsrf cookies无法设置?
非常感谢!
在 <head>
,最好是在你的 head.blade.php
你加载的每一个刀片文件中都包含了这个文件,试着添加。
<meta name="csrf-token" content="{{ csrf_token() }}">
这和表格没有任何关系。这是我的一个愚蠢的举动,所以把这个答案贴出来,以防其他人遇到同样的问题。
我在一个开口前有一个空格 <?php
标签。这个空间是在HTTP头之前发送给浏览器的,所以没有任何一个cookie被设置。
Doh!