Laravel 10线上环境CORS跨域请求被拦截问题求助
解决Laravel 10线上环境的CORS跨域拦截问题
问题排查
从你的配置和报错来看,核心问题集中在中间件重复注册、自定义中间件语法错误、配置缓存未清除这几点:
- Kernel中重复注册官方
HandleCors中间件,同时混用自定义CorsMiddleware,导致响应头设置冲突 - 自定义
CorsMiddleware中Access-Control-Allow-Headers的参数格式错误(多个请求头被拆成多个独立字符串,而非单个逗号分隔的字符串) - 线上环境未清除配置缓存,修改后的
cors.php未生效 cors.php中allowed_origins与allowed_origins_patterns同时设置,导致优先级冲突
分步解决方案
1. 清理Kernel.php的中间件配置
打开app/Http/Kernel.php,移除重复的HandleCors和自定义CorsMiddleware,确保全局中间件只保留一次官方HandleCors:
protected $middleware = [ // \App\Http\Middleware\TrustHosts::class, \App\Http\Middleware\TrustProxies::class, \Illuminate\Http\Middleware\HandleCors::class, // 仅保留这一次 \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
同时移除web中间件组里的\Illuminate\Http\Middleware\HandleCors::class,避免重复执行。
2. 修正cors.php配置
打开config/cors.php,调整如下(注释冲突配置项,明确允许的来源):
return [ 'paths' => ['*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['https://egr.net.au'], // 仅保留你的前端域名 // 'allowed_origins_patterns' => ['*'], // 注释此条,避免与allowed_origins冲突 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 3600, // 设置预请求缓存时长,减少OPTIONS请求次数 'supports_credentials' => false, ];
3. 强制清除线上环境缓存
线上环境Laravel会缓存配置,修改后必须执行以下命令使配置生效:
php artisan config:clear php artisan cache:clear php artisan route:clear
4. 验证预请求响应
用curl命令测试OPTIONS请求,确认CORS头正确返回:
curl -X OPTIONS https://egrdev.au/enquiry -H "Origin: https://egr.net.au" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: X-CSRF-TOKEN, Content-Type" -I
正常响应应包含:
Access-Control-Allow-Origin: https://egr.net.auAccess-Control-Allow-Methods: POSTAccess-Control-Allow-Headers: X-CSRF-TOKEN, Content-Type
5. 服务器额外检查(可选)
如果以上步骤无效,检查Nginx/Apache是否拦截了OPTIONS请求:
- Nginx可添加如下配置(仅在Laravel未处理预请求时使用,避免与Laravel响应头冲突):
location / { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin https://egr.net.au; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'X-CSRF-TOKEN, Content-Type, Authorization'; add_header Access-Control-Max-Age 3600; add_header Content-Length 0; add_header Content-Type text/plain; return 204; } }
内容的提问来源于stack exchange,提问作者user3449468
相关产品推荐
相关产品推荐

