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

Laravel 10线上环境CORS跨域请求被拦截问题求助

解决Laravel 10线上环境的CORS跨域拦截问题

问题排查

从你的配置和报错来看,核心问题集中在中间件重复注册、自定义中间件语法错误、配置缓存未清除这几点:

  1. Kernel中重复注册官方HandleCors中间件,同时混用自定义CorsMiddleware,导致响应头设置冲突
  2. 自定义CorsMiddleware中Access-Control-Allow-Headers的参数格式错误(多个请求头被拆成多个独立字符串,而非单个逗号分隔的字符串)
  3. 线上环境未清除配置缓存,修改后的cors.php未生效
  4. 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.au
  • Access-Control-Allow-Methods: POST
  • Access-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:47:09