多租户Laravel(Tenancy for Laravel)下Sanctum子域无法正常工作
解决Laravel Tenancy子域环境下Sanctum无法正常工作的配置方案
核心环境变量配置
直接在.env文件中设置通配符格式的域名参数,让所有子域能共享会话和Sanctum状态:
- 设置
SESSION_DOMAIN为主域的通配符,开头必须带点:SESSION_DOMAIN=.yourdomain.com - 设置
SANCTUM_STATEFUL_DOMAINS包含主域和所有子域,支持通配符:
本地开发时可追加前端地址,比如SANCTUM_STATEFUL_DOMAINS=yourdomain.com,*.yourdomain.comlocalhost:3000。
动态适配多租户场景(可选)
如果需要根据当前租户的子域动态调整配置,可在AppServiceProvider的boot方法中添加租户钩子:
use Illuminate\Support\Facades\Config; use Stancl\Tenancy\Facades\Tenancy; public function boot() { Tenancy::hook('tenant:initialized', function ($tenant) { // 获取当前租户的根域名 $domain = $tenant->domains->first()->domain; $rootDomain = substr($domain, strpos($domain, '.') + 1); // 动态覆盖会话和Sanctum配置 Config::set('session.domain', '.' . $rootDomain); Config::set('sanctum.stateful', [ $domain, $rootDomain, '*.' . $rootDomain ]); }); }
关键注意事项
- 调整
config/session.php中的same_site配置:跨域场景设为'none',同域设为'lax';生产环境需确保secure为true。 - 配置修改后必须清除缓存:
php artisan config:clear php artisan cache:clear - SPA应用需确保请求携带
withCredentials标识,否则Cookie无法正常传递。
内容的提问来源于stack exchange,提问作者Md Eshan
相关产品推荐
相关产品推荐

