无“访问控制-允许-来源”标题- Laravel [已关闭]

kqlmhetl  于 2022-11-26  发布在  其他
关注(0)|答案(9)|浏览(151)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
截至14小时前,机构群体正在审查是否重新讨论此问题。
Improve this question
XMLHttpRequest无法加载http://myapi/api/rating。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“http://localhost:8104”。响应的HTTP状态代码为403。
我不明白为什么我不能发出CORS请求。我已经在这里安装了中间件,并将其添加到全局http内核中,但它仍然不工作。尝试创建一个自定义中间件,给出stackoverflow建议,但也不工作。还尝试添加一个路由组。最后,我尝试在请求操作中手动设置响应头。我真的卡住了-感谢帮助!
代码请参见:https://gist.github.com/KerryRitter/0d7ababb7b9eb8d54f0ae55add9704a1

cgfeq70w

cgfeq70w1#

如果我使用了错误令牌被发送到受保护的API,Passport将返回401,并显示{“message”:“Unauthenticated "}。
但由于响应中不存在CORS标头,我的VUE应用程序出现CORS错误,无法处理响应代码。
因此,在http/kernel.php $middlewarePriority上的laravel5.8中,在\应用程序\Http\中间件\身份验证::类之前添加\Barryvdh\Cors\HandleCors::类
下面是我代码:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:300,1',
        'Localization',
        'bindings',
        'cors'
    ],
];

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

    // Add Localization MiddleWare
    'Localization' => \App\Http\Middleware\localization::class,
    'cors' => \Barryvdh\Cors\HandleCors::class,
];

protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,

    //add to handle cors before authenticate
    \Barryvdh\Cors\HandleCors::class,

    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
];

希望这对其他人有帮助

hs1rzwqc

hs1rzwqc2#

简单的答案是将Access-Control-Allow-Origin头设置为localhost或 *。创建一个名为Cors的简单中间件:

php artisan make:middleware Cors

将以下代码添加到app/Http/Middleware/Cors.php

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

您可以将 * 替换为localhost或保持原样。
下一步是加载middleware。将下面一行添加到app/Http/Kernel.php中的$routeMiddleware数组。

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

最后一步是在你想设置访问源头的路由上使用中间件。假设你正在谈论laravel 5. 3中的新api路由,那么做的地方是app/Providers/RouteServiceProvider.php,在mapApiRoutes()函数中(你可以删除或注解该函数前面的代码):

Route::group([
        'middleware' => ['api', 'cors'],
        'namespace' => $this->namespace,
        'prefix' => 'api',
    ], function ($router) {
         //Add you routes here, for example:
         Route::apiResource('/posts','PostController');
    });
eyh26e7m

eyh26e7m3#

当我在一个复合项目前端Reactjs和Laravel后端工作时,我遇到了 *“预检请求未通过访问控制检查:没有“Access-Control-Allow-Origin”。*我通过清除Heroku上部署的Reactjs应用该高速缓存解决了该问题。
How do I clear the build cache?

p8h8hvxi

p8h8hvxi4#

只是一些我想补充的东西,我必须做的除了步骤中提到的接受的答案。
我确实遇到了CORS错误后,几个生产部署(Laravel版本^7.0在Nginx),甚至在设置HandleCors如这里提到的。它开始工作后,我运行php artisan config:cachecomposer installcomposer dump-autoload
希望这能帮助那些在部署过程中没有更新任何配置文件的情况下试图调试错误的人。

au9on6nz

au9on6nz5#

在我的案例中,我运行了更新,将Laravel从v7.x移动到v9.x,并导致localhost API访问CORS错误。
如果以上都不适用于您,我将问题追溯到TrustProxies中间件中的$headers变量。
此变量的原始值为Request::HEADER_X_FORWARDED_ALL;
在更新到下面这个之后,它又活了过来。
请求::标题_X_转发_用于|请求::标题_X_转发_主机|请求::标题_X_转发_端口|请求::标题_X_转发_方案|请求:标题_X_转发_AWS_ELB;
请参阅https://laravel.com/docs/9.x/upgrade和“可信代理”部分以获取参考。
这一切对我来说意味着什么,阅读整个升级文档,即使你不认为元素适用于你的项目...

eaf3rand

eaf3rand6#

如果您正在使用Laravel 5.5Laravel 5.x,并面临同样的问题,如No 'Access-Control-Allow-Origin' header is present on the requested resource。只需使用以下软件包和配置您的系统。
第一步:

composer require barryvdh/laravel-cors

第二步
您还需要将Cors\ServiceProvider添加到config/app.php提供程序数组中:

FruitCake\Cors\CorsServiceProvider::class,

要允许所有路由使用CORS,请在app/Http/Kernel.php类的$middleware属性中添加HandleCors中间件:
对于全球使用:

protected $middleware = [
    // ...
    \Fruitcake\Cors\HandleCors::class,
];

对于中间件用途:

protected $middlewareGroups = [
   'web' => [
       // ...
   ],

   'api' => [
        // ...
        \Fruitcake\Cors\HandleCors::class,
    ],
];

第三步
安装完成后,运行以下命令以发布供应商文件。

php artisan vendor:publish --provider="Fruitcake\Cors\ServiceProvider"

希望这个答案能帮助那些和我面临同样问题的人。

cpjpxq1n

cpjpxq1n7#

由于安全问题,Laravel默认限制跨源请求。我们需要创建一个Cors中间件来接受来自不同源的请求。
步骤1:创建Cors中间件。

php artisan make:middleware Cors

第2步:在返回前在句柄函数中添加以下行。

//header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Origin:  http://localhost:4200');
header('Access-Control-Allow-Headers:  Content-Type, X-Auth-Token, Authorization, Origin');
header('Access-Control-Allow-Methods:  POST, PUT');

步骤3:在app/Http/Kernel.php文件中注册中间件。

Add below line in $middleware array 

\App\Http\Middleware\Cors::class,

步骤4:现在我们需要调用app/Http/Kernel.php文件中的中间件

Add below line in $routeMiddleware array 

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

xmjla07d8#

https://github.com/barryvdh/laravel-cors
laravel-cors包允许您使用Laravel中间件配置发送跨源资源共享头。
特色
处理CORS飞行前OPTIONS请求将CORS标题添加到您的响应

t0ybt7op

t0ybt7op9#

我最近在laravel 5.4中遇到了这个错误,我正在向我自己的网站发送 AJAX post请求,并且仍然得到这个相同的错误,我遇到这个错误是由于两个原因,确切地说,
error: XMLHttpRequest cannot load https://[mydomain].com/quote/short. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://[mydomain].com' is therefore not allowed access.
上述错误的原因是,我是张贴请求http域从https域,所以当我把它改为https,错误被解决,然后我再次得到同样的错误,由于类似的原因,这是原因,这一次,域有www.和请求的一个没有,我添加www.后,它的工作就像一个魅力。
对于跨源请求,我使用以下解决方案:
1.创建一个中间件(在我的例子中是cors),代码如下

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

1.将中间件插入kernal.php中的routeMiddleware数组
'cors' => \App\Http\Middleware\Cors::class,
1.将中间件添加到相关路由
Route::get('myRoute', ['middleware' => 'cors' , 'uses'=> 'MyController@Action']
希望这个答案能帮助那些和我面临同样问题的人。

相关问题