最准最快验证Laravel 5 CORS配置是否生效的方式是用curl -I -X OPTIONS测试预检请求,检查响应头是否含Access-Control-Allow-Origin等关键CORS头;若返回403/405或缺失头,说明请求未进Laravel,需检查Nginx对OPTIONS的处理配置。

直接用 curl -I -X OPTIONS http://your.app/api/endpoint 测试预检请求,看响应头是否包含 Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers 和 Access-Control-Allow-Credentials —— 这是验证 Laravel 5 CORS 配置是否生效最准、最快的方式。
确认 Laravel 5 用的是 barryvdh/laravel-cors
Laravel 5.5 不兼容 fruitcake/laravel-cors,必须用 barryvdh/laravel-cors。否则 curl 测试永远返回 404 或无 CORS 头。
- 执行
composer require barryvdh/laravel-cors - 手动在
config/app.php的'providers'数组末尾添加:Barryvdh\Cors\ServiceProvider::class - 运行
php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"生成config/cors.php - 清配置缓存:
php artisan config:clear && php artisan config:cache
关键配置项不能错(尤其开发环境)
打开 config/cors.php,重点检查这几项:
利用农业相机拍摄植物叶片高分辨率图像,通过AI视觉技术检测叶片卷曲方向(向上卷曲或向下卷曲)
-
'paths' => ['api/*']—— 确保覆盖你的 API 路由路径 -
'allowed_origins' => ['http://localhost:3000']—— 开发时写具体地址,别用 ['*'](尤其开了supports_credentials) -
'allowed_headers' => ['Content-Type', 'Authorization', 'X-Requested-With']—— 前端实际发什么头,这里就得列什么,漏掉Authorization就会卡在预检 -
'supports_credentials' => true时,allowed_origins必须是明确域名,且前端请求要带withCredentials: true
用 curl 测试的正确姿势
别只测 GET,CORS 问题几乎都出在 OPTIONS 预检上:
- 测试预检:
curl -I -X OPTIONS http://your.app/api/users - 看返回状态码:应为 200 或 204,不是 405 或 403
- 检查响应头中是否有:
•Access-Control-Allow-Origin: http://localhost:3000
•Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
•Access-Control-Allow-Headers: Content-Type, Authorization - 如果返回 403/405 或没这些头,说明请求根本没进 Laravel —— 很可能是 Nginx/Apache 拦截了 OPTIONS,需检查 Web 服务器配置
绕过 Laravel 直接测 Nginx 是否放行 OPTIONS
如果 curl 返回 405 Method Not Allowed,大概率是 Web 服务器没配 OPTIONS 处理逻辑:
- Nginx 中对应
location ~ ^/api/块里,必须有:
add_header Access-Control-Allow-Origin "http://localhost:3000";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Max-Age "86400";
return 204;
}
- add_header 必须写在 location 块内,写在 server 级别不生效
- 改完 Nginx 配置后记得
nginx -t && systemctl reload nginx

















