Laravel8添加@csrf仍报419错误 关闭csrf后session不生效问题求助
问题根因
核心问题是路由未引入Laravel默认的web中间件组,导致session、csrf校验功能未正常初始化:Laravel的session持久化、csrf令牌校验逻辑全部封装在web中间件组中,缺失该配置会直接出现419页面过期、session刷新丢失的问题。
排查修复步骤
1. 补充web中间件配置
将所有路由嵌套到web中间件组下,调整路由代码如下:
<?php use Illuminate\Support\Facades\Route; // 外层加web中间件,确保session、csrf功能正常加载 Route::middleware('web')->prefix(LaravelLocalization::setLocale())->middleware(['localeSessionRedirect', 'localizationRedirect'])->group(function () { // 其他原有路由保持不变 Route::group(['middleware'=>['CustomAuth']],function(){ Route::get('/user-login',[App\Http\Controllers\UserController::class,'showLogin']); Route::get('/user-register',[App\Http\Controllers\UserController::class,'showRegister']); Route::get('/affiliate',[App\Http\Controllers\UserController::class,'showAffiliateDashboard']); Route::get('/affiliate/website-list',[App\Http\Controllers\UserController::class,'affiliate_website_list']); // 其余相似路由保持不变 }); // 提交表单路由、登出路由等保持不变 Route::post('/check',[App\Http\Controllers\UserController::class,'checkLogin'])->name('checkLogin'); Route::post('/user-register',[App\Http\Controllers\UserController::class,'createAccount'])->name('create_account'); // 其余路由保持不变 });
2. 恢复CSRF校验配置
删掉VerifyCsrfToken.php中$except = ['*']的全局关闭配置,全局关闭csrf不仅有安全风险,还会干扰session初始化逻辑,仅需要排除第三方回调类的无需校验的路由即可。
3. 调整中间件执行顺序
打开app/Http/Kernel.php,确保自定义的CustomAuth中间件的执行顺序在StartSession中间件之后,避免session未初始化就读取登录状态导致逻辑错误:
- 如果你是把
CustomAuth加到$middlewareGroups的web数组里,就放在\Illuminate\Session\Middleware\StartSession::class的下一行 - 如果是路由里单独指定中间件,就写成
['middleware'=>['web', 'CustomAuth']]即可
4. 校验session配置
打开config/session.php检查:
path配置为'/',确保不同语言前缀的路由都能正常读取session cookiedomain配置为你的站点根域名,本地开发环境留空即可
5. 清除缓存生效
修改完成后执行以下命令清理缓存:
php artisan config:clear php artisan route:clear php artisan cache:clear
完成以上步骤后重新测试登录、刷新页面,419报错和session丢失问题即可解决。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

