Laravel 8.12搭配Ngrok使用时Session无法正常存取问题求助
Laravel Session 跨请求数据丢失排查指南
你遇到的每次请求CSRF _token 随机变化、自定义写入的Session数据跨请求无法读取,核心逻辑是请求之间没有正确复用同一个Session ID,导致每次访问都生成全新的空Session实例,可按以下顺序逐一排查解决:
第一步:校验浏览器端Cookie传递是否正常
- 打开浏览器开发者工具的「应用-存储-Cookie」面板,先访问
/set路由,检查对应域名下是否生成了和配置匹配的Session Cookie(默认Cookie名可在config/session.php的cookie字段查看,通常为laravel_session) - 核对Cookie属性是否符合访问要求:
- 本地http协议访问时,Cookie的
Secure属性不能为true,否则浏览器会直接拦截、不存储该Cookie - Cookie的
Domain字段必须和当前访问域名完全匹配,避免跨域拦截:本地访问对应域名为127.0.0.1,Ngrok公网访问对应域名为生成的临时Ngrok域名 - 不要用无痕/隐私模式测试,这类模式默认会限制非必要Cookie的存储
- 本地http协议访问时,Cookie的
第二步:核对Laravel Session配置是否匹配
- 打开
config/session.php文件,逐项校验配置项:- 确认
driver字段指定的Session存储(file/database/redis等)对应路径/表的权限,是Web服务运行账号可读写的:比如使用file驱动时,storage/framework/sessions目录需开放可写权限,否则Session写入失败会触发每次请求自动新建Session - 确认
expire_on_close字段为false:如果该值设为true,浏览器会话关闭后Session即失效,测试过程中如果没有保持Cookie关联,就会出现每次请求都是新Session的情况 - 确认
same_site、secure字段和访问场景匹配:本地http测试时不要强制开启secure=true,否则浏览器不会存储对应Cookie
- 确认
第三步:检查Session中间件挂载是否正确
- Laravel的Session持久化逻辑由
StartSession中间件实现,需确认该中间件已正确挂载到对应路由组中 - 如果你测试的路由定义在
routes/api.php中,要注意API路由组默认不加载Session相关中间件,这种情况下需要在对应路由组手动挂载StartSession中间件,否则不会触发Session的读取、持久化逻辑
第四步:Ngrok公网访问场景特殊排查
- 如果本地
127.0.0.1的Session读写正常、仅Ngrok公网访问出现丢失,需要检查config/session.php的domain字段是否配置为对应Ngrok的公网域名,不要写死本地127.0.0.1,否则Ngrok域名下浏览器不会携带本地域的Cookie
异常对应关系:你观察到每次请求返回的
_token值不同,正是因为每次请求都生成了全新的空Session实例,Laravel在空Session中会自动生成新的CSRF令牌,之前存储的data字段因为关联的旧Session ID没有被请求携带,自然无法被读取到。
内容的提问来源于stack exchange,提问作者Sachin Sarola
相关产品推荐
相关产品推荐

