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
相关产品推荐
相关产品推荐

