Laravel 11+Vue 3多租户子域名CORS及Cookie无效问题求助
我用Laravel 11做REST API,搭配Vue.js 3(Pinia+Vue Router)构建SPA,基于TenancyForLaravel实现多租户,认证用Sanctum,开发环境是Mac下的Laravel Sail。之前只做过单域名SPA,现在遇到子域租户API的CORS问题,具体配置和错误如下:
当前配置
.env 文件
SESSION_DOMAIN=.localhost SANCTUM_STATEFUL_DOMAINS=localhost:5174,.localhost:5174,.localhost,localhost,entreprise1.localhost:5174 ALLOWED_ORIGINS="http://localhost:5174,http://entreprise1.localhost:5174"
cors.php 配置
'paths' => ['api/*'], 'allowed_methods' => ['*'], 'allowed_origins' => array_map('trim', explode(',', env('ALLOWED_ORIGINS', '*'))), 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true,
axios.js 配置
import axios from "axios"; axios.defaults.baseURL = import.meta.env.VITE_APP_URL; axios.defaults.withCredentials = true; axios.defaults.withXSRFToken = true; export default axios;
Store 中租户重定向请求代码
async redirectToTenant(tenant) { await axios.get('http://entreprise1.localhost/api/csrf-cookie'); // const response = await axiosServices.get('/redirect/'+tenant) // window.location.href = response.data.redirect_url }
错误现象
SPA从主域发起API请求正常,但向租户子域entreprise1.localhost发起csrf-cookie请求时,出现两个错误:
- Cookie “XSRF-TOKEN”因域名无效被拒绝
- Cookie “laravel_session”因域名无效被拒绝
问题排查与解决
1. 清理.env中的冗余与错误配置
- ALLOWED_ORIGINS的引号问题:当前配置带双引号,会导致
array_map处理后元素包含多余引号,直接去掉引号:ALLOWED_ORIGINS=http://localhost:5174,http://entreprise1.localhost:5174 - 简化SANCTUM_STATEFUL_DOMAINS:
.localhost:5174已覆盖所有子域+5174端口的情况,无需单独列子域项:SANCTUM_STATEFUL_DOMAINS=localhost:5174,.localhost:5174
2. 修正Axios跨域请求逻辑
当前Axios的baseURL是主域,硬编码子域请求会引发Cookie校验冲突,建议动态切换baseURL后再请求:
async redirectToTenant(tenant) { // 临时切换Axios的baseURL到目标子域 const originalBaseURL = axios.defaults.baseURL; axios.defaults.baseURL = `http://${tenant}.localhost`; await axios.get('/api/csrf-cookie'); // 可选:请求完成后恢复原baseURL axios.defaults.baseURL = originalBaseURL; // const response = await axios.get('/redirect/'+tenant) // window.location.href = response.data.redirect_url }
3. 本地hosts映射与浏览器缓存处理
- 在
/etc/hosts中添加子域映射,确保本地能解析子域:127.0.0.1 entreprise1.localhost - 清除浏览器中
localhost相关的所有Cookie,避免旧缓存干扰,然后执行sail restart重启Laravel服务。
4. 确认Cookie域名规则
Cookie的域名匹配不包含端口,SESSION_DOMAIN=.localhost的配置是正确的,但要确保Laravel服务返回的Cookie域名严格为.localhost(不带端口),可通过浏览器开发者工具的「网络」面板查看响应头中的Set-Cookie字段验证。
内容的提问来源于stack exchange,提问作者YsohTrish
相关产品推荐
相关产品推荐

