You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11+Vue 3多租户子域名CORS及Cookie无效问题求助

子域多租户SPA的Sanctum 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:47:20