Laravel首次页面加载无法识别已登录用户,加载后接口可正常获取登录信息
问题核心原因排查方向
静态缓存命中
这是最高发的原因:如果你的首页配置了服务端页面缓存(比如Laravel页面缓存中间件、Nginx静态缓存、CDN缓存),登录后重定向返回的是缓存好的未登录状态静态页面,Blade的@auth判断逻辑根本没有在服务端执行,直接返回了缓存内容。后续的auth-check是动态接口,不会走页面缓存规则,所以可以正常读取到登录态。
排查方法:清空所有页面缓存后重新登录测试,看首次渲染是否正常。路由未绑定Web中间件组
Laravel的用户登录态依赖web中间件组中的StartSession、AuthenticateSession等中间件初始化,如果你把首页路由写在了routes/api.php里,或者手动移除了首页路由的web中间件,服务端渲染Blade时Auth门面无法读取Session中的用户信息。而你的auth-check接口如果绑定了web中间件,自然可以正常返回用户数据。
排查方法:查看routes/web.php中首页路由的配置,确认没有用->withoutMiddleware('web')这类逻辑。Session Cookie配置不匹配
检查.env文件中的Session相关配置:如果存在跨子域访问的场景,SESSION_DOMAIN没有配置为根域名;或者SESSION_SAME_SITE、SESSION_SECURE配置和站点访问协议不匹配,都会导致首页首次请求时浏览器没有携带Session Cookie,服务端识别为未登录。如果你的axios全局配置了withCredentials: true,接口请求可以正常携带Cookie,就会出现接口正常但首屏异常的情况。
排查方法:打开浏览器开发者工具的「网络」面板,查看首页请求的请求头中是否携带了laravel_sessionCookie。登录逻辑未正确写入Session
如果你在登录逻辑中使用了Auth::login()之后没有手动调用$request->session()->save(),且后续逻辑有提前终止响应的操作,可能会出现Session写入滞后的情况:登录响应已经返回,Session还没写入存储,首次访问首页时读不到新的Session数据,等后续接口请求时Session已经写入完成,就可以正常读取。
内容的提问来源于stack exchange,提问作者M. Heck

