Laravel 6 未设置会话和 CSRF Cookie -- 每次加载页面时会话数据库中的新条目
Laravel 6 Session and CSRF Cookies Not Being Set -- New Entry in Session DB for Each Page Load
我是 Laravel 的新手,我有一个 Laravel 6 应用程序,但会话未按预期运行。每当我提交表单时,它都会导致 419 页过期错误。
@csrf
包含在每个表格中,所以这不是问题。
相反,我看到的是 浏览器中既没有设置会话 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
标记外,我还尝试过:
- 在多个浏览器中测试
- 重新启动我的机器并重试
- 正在使用
php artisan cache:clear && php artisan config:cache
清除缓存
- 在文件和数据库会话驱动程序之间来回切换
None 有效。
还有什么可能导致 session/csrf cookie 未设置?
提前致谢!
在 <head>
中,最好在您加载的每个 Blade 文件中包含的 head.blade.php
中,尝试添加:
<meta name="csrf-token" content="{{ csrf_token() }}">
这与表格无关。这对我来说是一个愚蠢的举动,所以发布这个答案以防其他人偶然发现同样的问题。
我的一个文件中的开始 <?php
标记之前有一个 space。 space 在 HTTP header 之前被发送到浏览器,所以 none 的 cookie 被设置了。
呸!
我是 Laravel 的新手,我有一个 Laravel 6 应用程序,但会话未按预期运行。每当我提交表单时,它都会导致 419 页过期错误。
@csrf
包含在每个表格中,所以这不是问题。
相反,我看到的是 浏览器中既没有设置会话 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
标记外,我还尝试过:
- 在多个浏览器中测试
- 重新启动我的机器并重试
- 正在使用
php artisan cache:clear && php artisan config:cache
清除缓存
- 在文件和数据库会话驱动程序之间来回切换
None 有效。
还有什么可能导致 session/csrf cookie 未设置?
提前致谢!
在 <head>
中,最好在您加载的每个 Blade 文件中包含的 head.blade.php
中,尝试添加:
<meta name="csrf-token" content="{{ csrf_token() }}">
这与表格无关。这对我来说是一个愚蠢的举动,所以发布这个答案以防其他人偶然发现同样的问题。
我的一个文件中的开始 <?php
标记之前有一个 space。 space 在 HTTP header 之前被发送到浏览器,所以 none 的 cookie 被设置了。
呸!