Laravel切换SESSION_DRIVER为database后表单提交报419错误如何解决
Laravel 切换database会话驱动后419错误与会话不持久化解决步骤
核心原因
该问题本质是切换驱动后会话无法正常持久化,导致每次请求生成新的会话ID,csrf令牌校验不通过触发419错误,按以下步骤逐一排查即可:
1. 确认sessions表结构完全正确
不要手动创建sessions表,必须使用Laravel官方提供的迁移生成:
- 执行生成迁移命令:
php artisan session:table - 执行迁移:
php artisan migrate
官方sessions表必须包含以下字段,字段类型与约束不能修改:
| 字段名 | 类型 | 约束 |
|---|---|---|
| id | varchar(40) | 主键 |
| user_id | bigint unsigned | 可空、索引 |
| ip_address | varchar(45) | 可空 |
| user_agent | text | 可空 |
| payload | text | 非空 |
| last_activity | int | 非空、索引 |
注:如果id字段长度小于40、payload字段存储空间不足,会导致会话写入失败,每次生成新会话
2. 核对会话配置项
检查.env与config/session.php中的配置:
- 确认
SESSION_DRIVER=database未被其他环境变量覆盖 - 如果你用非默认数据库连接存储会话,确认
SESSION_CONNECTION配置的连接有权限操作sessions表 - 核对域名相关配置:
- 本地开发时
SESSION_DOMAIN留空或者配成你实际访问的域名,不要混用127.0.0.1和localhost访问站点 - HTTPS站点必须配置
SESSION_SECURE_COOKIE=true,HTTP站点配置为false SESSION_SAME_SITE默认配置为lax即可,不要随意修改为strict或者none
- 本地开发时
3. 清理缓存与旧Cookie
修改配置后必须清理所有缓存,避免旧配置生效:
- 执行清理命令:
php artisan config:clear php artisan cache:clear php artisan view:clear - 清空浏览器中对应站点的Cookie,特别是旧的
laravel_sessionCookie
4. 确认路由所属中间件组
你的登录路由必须放在web中间件组下,web中间件组默认包含启动会话的StartSession中间件,放在api中间件组或者无中间件的路由不会启动会话,自然无法持久化。
验证会话是否正常
可以写测试路由确认会话是否持久化:
Route::get('/test-session', function () { session()->put('test', 'ok'); return session('test'); })->middleware('web');
第一次访问返回ok后刷新页面,如果仍然返回ok说明会话已正常持久化,此时再测试登录表单即可解决419错误。
内容的提问来源于stack exchange,提问作者ejfrancis
相关产品推荐
相关产品推荐

