
Laravel 使用 fruitcake/laravel-cors 时,即使设置了 'allowed_methods' => ['*'],若未正确配置 paths,预检请求(preflight)仍不会应用 CORS 头,导致 PUT/DELETE 等非简单方法被浏览器拦截。
laravel 使用 fruitcake/laravel-cors 时,即使设置了 `'allowed_methods' => ['*']`,若未正确配置 `paths`,预检请求(preflight)仍不会应用 cors 头,导致 put/delete 等非简单方法被浏览器拦截。
在 Laravel 中启用跨域资源共享(CORS)时,fruitcake/laravel-cors 并非对所有路由全局生效——它依赖于 paths 配置项来决定哪些路由应被中间件拦截并注入响应头。你当前的配置中:
'paths' => [],
表示不匹配任何路径,因此中间件根本不会执行,自然也不会设置 Access-Control-Allow-Methods: PUT, POST, GET, DELETE, ... 等关键响应头。浏览器在发送 PUT 请求前会先发起 OPTIONS 预检请求,而该请求返回的响应中缺失允许的 HTTP 方法列表,从而触发错误:
Method PUT is not allowed by Access-Control-Allow-Methods in preflight response
✅ 正确做法是明确指定需启用 CORS 的路由路径模式。对于标准 API 路由,推荐配置为:
// config/cors.php 'paths' => ['api/*'], 'allowed_methods' => ['*'], 'allowed_origins' => ['https://www.php.cn/link/97a34e8859e946b5313f18f5f5f4c9f6'], // ❗避免使用 '*' 配合 supports_credentials = true 'allowed_headers' => ['*'], 'supports_credentials' => true, 'max_age' => 3600,
⚠️ 注意事项:
supports_credentials => true时,allowed_origins*不能为 `['']**,否则浏览器将拒绝响应(这是 CORS 规范强制要求)。请精确填写前端域名,如https://www.php.cn/link/97a34e8859e946b5313f18f5f5f4c9f6或https://www.php.cn/link/6dda8f32d9ddc2a9ffe87be7d361a5c9`。-
若使用 Vue.js SPA 发送带凭据(如 cookies、Authorization header)的请求,请确保前端
fetch或 Axios 配置中启用 credentials:// Axios 示例 axios.put('/api/v1/attributes/3', data, { withCredentials: true }) -
修改
config/cors.php后,运行以下命令刷新配置缓存(尤其在生产环境):php artisan config:clear
-
如需更细粒度控制(例如仅对特定控制器启用 CORS),也可在路由定义中显式调用中间件:
Route::middleware('cors')->group(function () { Route::put('/api/v1/attributes/{id}', [AttributeController::class, 'update']); });
总结:'allowed_methods' => ['*'] 本身有效,但前提是中间件必须被激活——而激活的前提是 paths 匹配到对应路由。将 'paths' => ['api/*'](或更具体的 'api/v1/*')设为非空数组,是解决 PUT 方法被拦截的根本所在。











