Laravel8切换MongoDB后所有POST请求报419 PAGE EXPIRED如何解决?
问题解决步骤
419 PAGE EXPIRED是Laravel CSRF令牌校验失败的标准报错,你定位到的inExceptArray是VerifyCsrfToken中间件下的路由排除判断方法,始终返回false意味着你配置的CSRF豁免路由没有被正确匹配,结合切换MongoDB的操作,按以下步骤排查:
1. 修正Session驱动配置
你切换数据库后如果没有同步修改Session存储配置,会导致Session无法正常写入,CSRF令牌校验上下文丢失,同时请求对象的路由匹配逻辑也会受影响:
- 打开
config/session.php,将driver配置项从原database修改为mongodb(jenssegers/laravel-mongodb扩展自带适配的Session驱动) - 如果你配置的MongoDB连接名不是默认的
mongodb,同步修改同文件下的connection配置项为你实际的连接名 - 执行
php artisan config:clear清空配置缓存使修改生效
2. 修正用户模型继承关系
Jetstream默认的User模型继承自Illuminate框架的原生认证类,切换MongoDB后需要替换为扩展提供的认证基类,否则用户Session信息存储异常,会间接导致请求对象的属性读取异常,让$request->is()、$request->fullUrlIs()判断失效:
- 打开
app/Models/User.php,将原继承的Illuminate\Foundation\Auth\User替换为Jenssegers\Mongodb\Auth\User
3. 校验CSRF排除路由配置格式
确认app/Http/Middleware/VerifyCsrfToken.php中$except数组的路由格式符合匹配要求:
- 单路径路由不要带多余的前缀斜杠,例如写
api/webhook而非/api/webhook - 通配符路由按规则书写,例如匹配所有api路由写
api/* - 带域名的完整路由需要写全协议和域名,才能被
fullUrlIs方法正确匹配 - 可临时在
inExceptArray方法中打印$except、$request->path()、$request->fullUrl()的实际值,定位匹配逻辑的不匹配点
4. 快速验证方法
可以临时在VerifyCsrfToken.php的$except数组中加入*,豁免所有路由的CSRF校验,如果POST请求可以正常访问,即可确认问题出在CSRF匹配逻辑,再按上面的步骤逐一排查即可。
额外注意:请确认你安装的jenssegers/laravel-mongodb扩展版本和Laravel 8适配,Laravel 8对应扩展的3.x版本,安装更高版本会出现不兼容导致的各类请求、Session异常。
内容的提问来源于stack exchange,提问作者Hafsa
相关产品推荐
相关产品推荐

