【问题标题】:CORS Preflight request deniedCORS 预检请求被拒绝
【发布时间】:2021-03-27 01:08:21
【问题描述】:

有一个 login API 并将其放在 CORS 中间件中,以便从其他地方运行它 -

Route::group(['middleware' => ['cors']], function () { 
     Route::post('login', [AuthController::class, 'login']);
});

中间件 'cors' 写在 $routeMiddleware 中的 'kernel.php' 文件中,如

protected $routeMiddleware = [
    //some other middlewares 
    'cors' => \App\Http\Middleware\Cors::class, 
];

在同一个文件中,一个名为$middleware变量被定义为

protected $middleware = [
    // Some similar classes 
    \Fruitcake\Cors\HandleCors::class,
];

Cors.php包含以下代码

public function handle(Request $request, Closure $next)
{
    header("Access-Control-Allow-Origin: *");
    $headers = [
        'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
        'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin, Accept, Authorization'
    ];
    if($request->getMethod() == "OPTIONS") {
        return Response::make('OK', 200, $headers);
    }

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

现在,当我从 移动应用程序 使用此登录 API 时,系统会出现以下错误

Access to XMLHttpRequest at '.../laravel/public/api/login' from origin 'http://localhost:8100' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

并且/或者,换句话说,我无法登录。

请帮我解决这个问题。 谢谢。

【问题讨论】:

  • 预检请求是一个 OPTIONS 请求,请确保您的系统正确处理该请求。 (现在,我只在你的 CORS 设置中看到 Route::post,所以我假设 OPTIONS 可能还没有得到正确处理。虽然不知道在 Laravel 中设置的细节。)
  • 使用你的系统ip,如果你想像http://yourip/api一样点击本地,不要使用本地主机
  • 我已经在 Cors.php 中处理了 OPTIONS 请求

标签: php laravel ionic-framework cors middleware


【解决方案1】:

我认为您可能混淆了两种不同的 CORS 实现。

从 Laravel 7x 开始,使用 \Fruitcake\Cors\HandleCors 中间件将 CORS 处理内置到 Laravel 中。您的 CORS 配置在 config/cors.php 文件中处理。

您可以删除您的自定义 \App\Http\Middleware\Cors 类,只需更新您的 config/cors.php 文件以包含 CORS 可用路径。默认情况下,您的所有 api 路由都已包含在内。

【讨论】:

  • 好的,我已经从 kernel.php 文件中删除了自定义 'cors' => \App\Http\Middleware\Cors::class 然后我如何必须在 api.php 文件中使用 \Fruitcake\Cors\HandleCors::class 中间件或者我如何在中写入登录 api Route::post('login', [AuthController::class, 'login']); api.php 文件。
  • @ddrajsharma \Fruitcake\Cors\HandleCors 中间件已经是您内核中定义的全局中间件。您无需尝试将其分配给任何路线。但是,您确实需要更新您的 config/cors.php 文件以包含您希望启用 CORS 的任何路由。除非您更改了它,否则默认安装已经包含 'api/*',因此您的 api.php 路由文件中定义的任何路由都将起作用。
  • @ddrajsharma 没问题。我建议将此标记为已接受的答案,让其他人知道它解决了这个问题,以防他们遇到同样的问题。
  • 是的,谢谢,这就是我所做的,但在我的情况下,api 中的所有路由都工作正常,除了也位于 api、php 内部的路由。您能对此有所了解吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2023-03-27
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多