Laravel 5.6 CORS 问题

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/50589159/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 17:46:25  来源:igfitidea点击:

Laravel 5.6 CORS issue

phplaravelcors

提问by Kasra GH

I followed this postbut it only worked for GET method (as you can see it is mentioned in comments). I also installed this pakagebut again it only works for GET method. This the error I get:

我关注了这篇文章,但它只适用于 GET 方法(正如您在评论中所看到的那样)。我也安装了这个包,但它同样只适用于 GET 方法。这是我得到的错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin my originis therefore not allowed access. The response had HTTP status code 403.

请求的资源上不存在“Access-Control-Allow-Origin”标头。Origin我的原点因此不允许访问。响应具有 HTTP 状态代码 403。

PHP version: 7.1

PHP 版本:7.1

Laravel version: 5.6

Laravel 版本:5.6

Frontend application: angular app (Do I need to change sth here?)

前端应用程序:angular 应用程序(我需要在这里更改某些内容吗?)

//Cours.php (middleware I created myself using the first method)
class Cors
{
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT,         
DELETE, OPTIONS');
    }
}


//cors.php (config/cors.php second method using the laravel-cors package)
return [

    'supportsCredentials' => false,
    'allowedOrigins' => ['*'],
    'allowedOriginsPatterns' => [],
    'allowedHeaders' => ['*'],
    'allowedMethods' => ['*'],
    'exposedHeaders' => [],
    'maxAge' => 0,
];


//kernel.php
namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \Barryvdh\Cors\HandleCors::class,
];

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:60,1',
        'bindings',
    ],
];


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,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'cors' => \App\Http\Middleware\Cors::class,
];
}

回答by PersianArt

you need use first method this postwithout use any package then add also this class to protected $middlewarelike this postthen post method also have desired headers.

您需要不使用任何包情况下使用此帖子的第一种方法,然后添加此类以protected $middleware喜欢此帖子,然后 post 方法也有所需的标题。

it works for me, I hope work for you.

它对我有用,我希望对你有用。

回答by user3289261

No need any type package for laravel-cors. Just create Middleware:

laravel-cors 不需要任何类型的包。只需创建中间件:

namespace App\Http\Middleware;
use Closure;
class Cors {

    public function handle($request, Closure $next) {
        $allowedOrigins = ['http://myroute.xyz', 'http://clarkconcepts.net','http://localhost'];
        $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
        if (in_array($origin, $allowedOrigins)) {
            return $next($request)
                ->header('Access-Control-Allow-Origin', $origin)
                ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
                ->header('Access-Control-Allow-Headers',' Origin, Content-Type, Accept, Authorization, X-Request-With, cache-control,postman-token, token')
                ->header('Access-Control-Allow-Credentials',' true');
        }
        return $next($request);
    }
}

In app/Http/Kernel.php add Middleware in $middleware section:

在 app/Http/Kernel.php 的 $middleware 部分添加中间件:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\Cors::class, //added here
];

回答by Ardy Febriansyah

You could also use the great?laravel-cors package by barryvdh.

你也可以使用 barryvdh 的 great?laravel-cors 包。

After you have the package installed, the easiest way to get CORS support for all your routes is to add the middleware like this in Http/Kernel.php: ($middleware)

安装包后,为所有路由获得 CORS 支持的最简单方法是在 Http/Kernel.php 中添加这样的中间件:($middleware)

\Barryvdh\Cors\HandleCors::class

And edit config/Cors.php'allowedOrigins' => ['*']

并编辑 config/Cors.php'allowedOrigins' => ['*']

More info check https://github.com/barryvdh/laravel-cors/blob/master/readme.md

更多信息请查看https://github.com/barryvdh/laravel-cors/blob/master/readme.md