Laravel多域名下can中间件失效,登录后仍被重定向求助
1. 修复会话跨域共享问题
Laravel 默认会话绑定单个域名,dashboard.khassepaz.test 和主域名 khassepaz.test 的会话无法自动共享。需要修改 .env 文件中的 SESSION_DOMAIN 配置为 .khassepaz.test(注意开头的英文点),让所有子域名共享同一会话。修改后清理浏览器缓存和 Cookie,确保新配置生效。
2. 验证中间件执行与会话组件
检查 app/Http/Kernel.php 中的 $middlewareGroups['web'] 是否包含 StartSession、EncryptCookies、VerifyCsrfToken 这些核心组件(默认已包含)。当前中间件顺序 ['web', 'auth', 'can:isAdmin'] 是合理的,web 中间件需先启动会话,后续的 auth 和 can 才能正常识别用户。
3. 测试Gate是否被触发
在 AuthServiceProvider 的 boot 方法中给 Gate 添加日志输出,确认它是否被调用:
Gate::define('isAdmin', fn (\App\Models\User $user) => { \Log::info('isAdmin Gate 触发,用户ID:' . $user->id); return true; });
访问 dashboard 域名后,查看 storage/logs/laravel.log 中是否有这条日志。如果没有,说明 auth 中间件未识别到登录用户(大概率是会话跨域问题导致),直接触发了重定向。
4. 确认子域名路由注册状态
运行 php artisan route:list,检查输出中是否存在 dashboard.khassepaz.test 前缀的路由。同时确保 routes/dashboard.php 内有实际的路由定义,比如:
Route::get('/', function () { return 'Dashboard 页面'; });
若路由文件为空,访问时可能触发异常重定向,但结合你描述的现象,会话跨域仍是核心嫌疑点。
内容的提问来源于stack exchange,提问作者ali

