CORS 问题:Laravel 10 API 请求中不存在“Access-Control-Allow-Origin”标头

log*_*rap 6 php cors laravel axios

当我尝试从 React 应用程序向 Laravel API 发出 GET 请求时,我遇到了 CORS(跨域资源共享)问题。我在控制台中收到的具体错误如下:

从源“http://localhost:19000”访问“https://0748-102-146-2-29.ngrok-free.app/api/products-api”处的 XMLHttpRequest 已被 CORS 策略阻止:否请求的资源上存在“Access-Control-Allow-Origin”标头。

以下是我的设置的相关详细信息:Laravel API 配置(config/cors.php):

return [
'paths' => ['api/*', 'http://localhost:19000', 'sanctum/csrf-cookie'],
'allowed_methods' => ['GET', 'POST', 'PUT', 'DELETE'], // Add other methods as needed
'allowed_origins' => ['*'],
'allowed_headers' => ['*'],
// ...
];
Run Code Online (Sandbox Code Playgroud)

React 应用程序(useProductFetch.js):

import { useState, useEffect } from "react";
import axios from "axios";

const fetchData = async () => {
setIsLoading(true);

try {
  const response = await axios.get(
    "https://0748-102-146-2-29.ngrok- 
    free.app/api/products-api"
  );
  console.log("Axios request successful");

export default useProductFetch;
Run Code Online (Sandbox Code Playgroud)

Postman 请求:当我使用 Postman 向 API 端点https://0748-102-146-2-29.ngrok-free.app/api/products-api发送 GET 请求时,我收到了预期的响应:

{
"data": [
    // ...
]
Run Code Online (Sandbox Code Playgroud)

}

问题:尽管在 Laravel API 上配置 CORS 以允许所有来源和方法,但在从 React 应用程序发出请求时,我仍然面临 CORS 问题。我还验证了通过 Postman 直接访问时服务器返回了预期的响应。像这样“https://0748-102-146-2-29.ngrok-free.app/api/products-api”

问题:尽管我的 Laravel API 上有正确的 CORS 配置,但什么可能导致此 CORS 问题?我是否需要考虑其他事项或应采取任何其他步骤来确保我的 React 应用程序可以成功向 API 发出请求?任何见解或解决方案将不胜感激。谢谢你!

Jyo*_*moy 0

我在做自己的许多项目时也面临着同样的问题。您必须创建一个中间件来解决这个问题。下面的代码是我一直在使用的中间件。我已在其中添加了您的本地主机 URL。

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->headers->set('Access-Control-Allow-Origin' , 'http://localhost:19000');
        $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
        $response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
        return $response;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建中间件后,您必须在$routeMiddleware数组下的app/Http/Kernel.php文件中定义中间件,如下所示:

protected $routeMiddleware = [
        ...(Any previous middlewares)       

        'cors' => \App\Http\Middleware\Cors::class,

    ];
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以在 API 路由组或您创建的任何单独路由中使用它。例如:

Route::middleware(['cors'])->prefix('auth')->group(function () {
    Route::post('register', [AuthController::class, 'register']);
});
Run Code Online (Sandbox Code Playgroud)

确保运行php artisan config:clear命令只是为了确保您的应用程序没有任何缓存的配置。

希望这可以帮助。

  • 这不是正确的解决方案。CORS 自 v9 起内置于 Laravel(截至 2023 年 9 月,目前为 v10)。 (3认同)