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

Laravel API与Nuxt.js中PUT请求遭CORS策略拦截问题求助

问题:Laravel API PUT请求在Nuxt.js中触发CORS错误(Postman正常)

我用Laravel API配合Nuxt.js开发应用,目前GET、DELETE、POST请求都能正常工作,但执行PUT请求时浏览器控制台报CORS错误,用Postman测试PUT请求完全正常。

浏览器控制台报错信息

Access to XMLHttpRequest at 'http://localhost:8000/api/movie' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

actualizar.vue?a2cc:70 Error: Network Error
at createError (createError.js?16d0:16:1)
at XMLHttpRequest.handleError (xhr.js?ec6c:84:1)

PUT http://localhost:8000/api/movie net::ERR_FAILED

当前Laravel项目的Cors中间件代码

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Cors
{
   /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
    * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
    */
   public function handle(Request $request, Closure $next)
   {
       return $next($request)
      
  //Url a la que se le dara acceso a las peticiones
  ->header('Access-Control-Allow-Origin','*')
  //Métodos a los que se da acceso
  ->header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
  //Headers de la petición
  ->header("Access-Control-Allow-Headers",'*');

   }
}

问题原因

PUT属于非简单请求,浏览器会先发送OPTIONS预请求验证跨域权限。当前中间件先执行$next($request)再添加CORS头,导致OPTIONS请求被Laravel路由系统拦截(无对应路由),返回非200状态码,触发CORS错误。而GET/POST等简单请求无需预请求,因此能正常工作。

解决方案

1. 修改Cors中间件,优先处理OPTIONS请求

更新中间件代码,直接给OPTIONS预请求返回带CORS头的200响应:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Cors
{
    public function handle(Request $request, Closure $next)
    {
        // 直接处理OPTIONS预请求
        if ($request->isMethod('OPTIONS')) {
            return response()->json(['status' => 'ok'], 200)
                ->header('Access-Control-Allow-Origin', '*')
                ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
                ->header('Access-Control-Allow-Headers', '*');
        }

        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', '*');
    }
}

2. 确保中间件全局注册

打开app/Http/Kernel.php,将Cors中间件添加到$middleware数组中,确保所有请求都经过该中间件:

protected $middleware = [
    // ...其他已存在的中间件
    \App\Http\Middleware\Cors::class,
];

3. 清理Laravel缓存

执行以下命令刷新配置和路由缓存,确保修改生效:

php artisan config:clear
php artisan route:clear

完成以上步骤后,浏览器的OPTIONS预请求会得到正常的200响应,PUT请求就能顺利执行了。


内容的提问来源于stack exchange,提问作者Omar Elio Torres Castillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:44