【问题标题】:GET request result to CORS error in Lumen 8GET请求结果到流明8中的CORS错误
【发布时间】:2021-06-08 00:09:38
【问题描述】:

当 Axios 将 GET HTTP 发送到我的 Lumen 应用程序时,我遇到了这个 CORS 问题,发送 POST HTTP 似乎很好。我有这个处理 CORS 的中间件,下面是代码

<?php namespace App\Http\Middleware;

    use Closure;

    class CorsMiddleware{
     /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $headers = [
            'Access-Control-Allow-Origin'      => '*',
            'Access-Control-Allow-Methods'     => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Max-Age'           => '86400',
            'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With'
        ];

        if ($request->isMethod('OPTIONS'))
        {
            return response()->json('{"method":"OPTIONS"}', 200, $headers);
        }

        $response = $next($request);
        foreach($headers as $key => $value)
        {
            $response->header($key, $value);
        }

        return $response;
    }
}

然后添加到bootstrap/app.php

$app->middleware([
    App\Http\Middleware\CorsMiddleware::class, // cors middleware
]);

使用 POST 请求时,一切正常,但在执行 GET 请求时,会发生 CORS 错误。任何帮助,想法都非常感谢,在此先感谢。

我的前端应用在 http://localhost:3000 (NUXT) 上运行,而 Lumen 应用在 http://localhost:8000 上运行

下图是错误截图。

【问题讨论】:

  • 你能分享一下CORS错误信息吗?
  • @MuhammadDyasYaskur "从源 'localhost:3000' 访问 XMLHttpRequest 在 'localhost:3000' 已被 CORS 策略阻止:请求中不存在 'Access-Control-Allow-Origin' 标头资源。”
  • 这恰好是因为lumen不允许OPTIONS方法,所以我们需要显式添加。
  • @AnkitJindal 你能指导我如何添加它吗?
  • @JuliverGalleto 请标记适合您的解决方案,以便帮助其他面临类似问题的人。谢谢!!

标签: laravel axios lumen lumen-8


【解决方案1】:

这个问题的另一种解决方法是:

App\Providers目录下创建CatchAllOptionsRequestsProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

/**
 * If the incoming request is an OPTIONS request
 * we will register a handler for the requested route
 */
class CatchAllOptionsRequestsProvider extends ServiceProvider {
  public function register()
  {
    $request = app('request');
    if ($request->isMethod('OPTIONS'))
    {
      app()->options($request->path(), function() { return response('', 200); });
    }
  }
}

CorsMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //Intercepts OPTIONS requests
        if($request->isMethod('OPTIONS')) {
            $response = response('', 200);
        } else {
            // Pass the request to the next middleware
            $response = $next($request);
        }

        // Adds headers to the response
        $response->header('Access-Control-Allow-Methods', 'HEAD, GET, POST, PUT, PATCH, DELETE');
        $response->header('Access-Control-Allow-Headers', $request->header('Access-Control-Request-Headers'));
        $response->header('Access-Control-Allow-Origin', '*');

        // Sends it
        return $response;
    }
}

bootstrap/app.php中添加以下代码

$app->middleware([
   App\Http\Middleware\CorsMiddleware::class
]);

$app->register(App\Providers\CatchAllOptionsRequestsProvider::class);

【讨论】:

    【解决方案2】:

    Lumen 不允许使用OPTIONS 方法,会返回状态响应405 MethodNotAllowed,所以我们需要显式添加到路由中。

    修改ServiceProvider.php:

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            $request = app('request');
    
            // ALLOW OPTIONS METHOD
            if($request->getMethod() === 'OPTIONS')  {
                app()->options($request->path(), function () {
                    return response('OK',200)
                        ->header('Access-Control-Allow-Origin', '*')
                        ->header('Access-Control-Allow-Methods','OPTIONS, GET, POST, PUT, DELETE')
                        ->header('Access-Control-Allow-Headers', 'Content-Type, Origin');                    
                });
            }
        }
    }
    

    CorsMiddleware.php

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class CorsMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response = $next($request);
    
            $response->header('Access-Control-Allow-Origin','*');
    
            return $response;
        }
    }
    

    参考cors tutorial

    希望这对你有用!!

    【讨论】:

    • 谢谢亲爱的,但这个解决方案对我不起作用。
    猜你喜欢
    • 2018-06-07
    • 2019-11-10
    • 2019-12-02
    • 1970-01-01
    • 2018-05-12
    • 2017-06-22
    • 2022-01-06
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多