419 CSRF token 过期 !
问题
项目在运行一段时间后 csrf token 会过期,然后419错误,根据异常找到抛出错误的地方,查看其实是有csrf token的,开始的时候以为是不小心做了啥操作,就没在意,php artisan key:generate
重置key后就没事了,后面部署到服务器上后就没有了,过了几天又有了,奇怪的是 在谷歌浏览器上会有问题,在苹果的浏览器上就没事了,同时 谷歌浏览器的话过一段时间又好了,而且不知道怎么复现,我初步才测试因为session过期时间之类的导致的,但是不知道该怎么做,请大家给个解决方案,或者是说排查方向!
基础环境
- PHP >= 7.1.3
- laravel = 5.8.18
服务器环境
homestead
扩展
- encore/laravel-admin ^1.6
- endroid/qr-code ^3.6
- fideloper/proxy ^4.0
- intervention/image ^2.4
- jacobcyl/ali-oss-storage ^1.1
- laravel/framework 5.8.*
- laravel/tinker ^1.0
- laravolt/avatar ^2.2
- maatwebsite/excel ^3.1
- mews/captcha ^2.2
- overtrue/easy-sms ^1.1
- overtrue/laravel-lang ~3.0
- overtrue/laravel-pinyin ~3.0
- overtrue/laravel-socialite ~2.0
- predis/predis ^1.1
- yansongda/pay ^2.7
经过修改项目运行一周了,未再次出现,在这里整理下解决的方法:
SESSION_COOKIE、SESSION_DOMAIN 设置
其实根本问题就是 SESSION_COOKIE重复了,如果 SESSION_COOKIE 如果不配置的话 默认是自动生成的
如果本地开发环境和 测试服务器或者线上服务器 APP_NAME相同 的话 必须要设置 SESSION_DOMAIN,不然会形成session 冲突。
APP_NAME中文 :
Str::slug(env('APP_NAME', 'laravel')
获取session前缀的时候会忽略中文名,也可能不小心导致 APP_NAME相同最后附上参考链接:github讨论的链接!