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

Laravel 11多租户+NextJS跨域(CORS)问题求助

Laravel 11多租户CORS问题解决方案

问题核心

你的情况是单域名localhost:8000能正常跨域,但多租户子域名test1.localhost:8000触发CORS错误,本质是Laravel的CORS配置未覆盖租户子域名,且预请求(OPTIONS)未被正确处理。


1. 修正CORS配置文件

打开项目根目录下的config/cors.php,做以下调整:

  • 确保paths包含所有需要跨域的路由(比如login)
  • 用正则匹配允许所有localhost子域名的前端请求,替换allowed_origins为allowed_origins_patterns

修改后的关键配置片段:

return [
    'paths' => ['api/*', 'login', 'logout'], // 根据你的路由补充
    'allowed_methods' => ['*'],
    'allowed_origins_patterns' => [
        '/^http:\/\/.*\.localhost:3000$/', // 匹配所有localhost子域名前端
        '/^http:\/\/localhost:3000$/',     // 匹配主域名前端
    ],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true, // 若前端带cookie需开启
];

2. 确认CORS中间件加载顺序

Laravel 11的中间件配置在bootstrap/app.php,确保HandleCors中间件全局加载,且在路由中间件之前执行:

return Application::configure(basePath: dirname(__DIR__))
    ->withMiddleware(function (Middleware $middleware) {
        // 全局添加CORS中间件,确保预请求优先处理
        $middleware->append(\Illuminate\Http\Middleware\HandleCors::class);
    })
    ->create();

3. 动态处理租户域名(可选)

如果租户域名是动态生成的,可自定义中间件动态设置跨域头:
创建app/Http/Middleware/DynamicCors.php:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class DynamicCors
{
    public function handle(Request $request, Closure $next): Response
    {
        $origin = $request->header('Origin');
        // 验证请求来源是否为允许的租户前端域名
        if (preg_match('/^http:\/\/(.*\.)?localhost:3000$/', $origin)) {
            return $next($request)
                ->header('Access-Control-Allow-Origin', $origin)
                ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
                ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization')
                ->header('Access-Control-Allow-Credentials', 'true');
        }

        return $next($request);
    }
}

然后在bootstrap/app.php中替换默认CORS中间件:

$middleware->append(\App\Http\Middleware\DynamicCors::class);

4. 测试预请求

用curl验证OPTIONS预请求是否返回正确响应头:

curl -X OPTIONS http://test1.localhost:8000/login -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: POST" -v

检查响应头中是否存在Access-Control-Allow-Origin: http://localhost:3000。

内容的提问来源于stack exchange,提问作者Hasan Rabiee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:56:01