Laravel API遭CORS拦截求助:已装fruitcake/laravel-cors仍未解决
解决Laravel API CORS拦截问题(已安装fruitcake/laravel-cors仍无效)
1. 确认中间件注册位置
打开app/Http/Kernel.php,检查\Fruitcake\Cors\HandleCors::class的注册位置:
- 全局启用:必须将其放在
$middleware数组的最顶部,确保所有请求都经过CORS处理:
protected $middleware = [ \Fruitcake\Cors\HandleCors::class, \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\CheckForMaintenanceMode::class, // 其他中间件... ];
- 仅API路由组启用:在
$middlewareGroups的api组内添加该中间件:
protected $middlewareGroups = [ 'api' => [ \Fruitcake\Cors\HandleCors::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
2. 配置CORS规则
如果未发布过配置文件,先运行命令生成config/cors.php:
php artisan vendor:publish --tag="cors"
修改配置文件,根据实际需求调整规则:
return [ 'paths' => ['api/*'], // 匹配你的API路由前缀 'allowed_methods' => ['*'], 'allowed_origins' => ['*'], // 开发环境可临时用*,生产环境指定具体域名 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], // 包含自定义头如Authorization时,可明确列出或用* 'exposed_headers' => [], 'max_age' => 3600, 'supports_credentials' => false, // 需要携带Cookie时设为true ];
3. 清除Laravel缓存
修改配置后必须清除缓存,否则新规则不会生效:
php artisan config:clear php artisan route:clear php artisan cache:clear
4. 检查服务器代理配置(Nginx/Apache)
如果用Nginx部署,需确保配置不会覆盖Laravel返回的CORS头:
location / { if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization"; return 204; } }
Apache则在.htaccess中添加:
Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization"
5. 验证OPTIONS预检请求
前端复杂请求(带自定义头、PUT/DELETE方法)会先发送OPTIONS预检请求,通过浏览器控制台网络面板检查:
- 确保OPTIONS请求返回200/204状态码
- 响应头包含
Access-Control-Allow-Origin等正确CORS字段
6. 排查中间件冲突
临时禁用自定义或第三方中间件,测试是否有中间件修改/移除了CORS响应头,比如权限验证中间件返回错误时未携带CORS头。
内容的提问来源于stack exchange,提问作者VicA
相关产品推荐
相关产品推荐

