Подтвердить что ты не робот

Laravel 5.1 API Enable Cors

Я искал некоторые способы включения cors на laravel 5.1 в частности, я нашел несколько таких библиотек, как:

https://github.com/neomerx/cors-illuminate

https://github.com/barryvdh/laravel-cors

но ни один из них не имеет учебника по внедрению специально для Laravel 5.1, я пытался настроить, но он не работает.

Если кто-то уже реализовал CORS на laravel 5.1, я был бы благодарен за помощь...

4b9b3361

Ответ 1

Вот мое промежуточное ПО CORS:

<?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)
    {

        header("Access-Control-Allow-Origin: *");

        // ALLOW OPTIONS METHOD
        $headers = [
            'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers'=> 'Content-Type, X-Auth-Token, Origin'
        ];
        if($request->getMethod() == "OPTIONS") {
            // The client-side application can set only headers allowed in Access-Control-Allow-Headers
            return Response::make('OK', 200, $headers);
        }

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

}

Чтобы использовать промежуточное ПО CORS, вы должны сначала зарегистрировать его в файле app\Http\Kernel.php следующим образом:

protected $routeMiddleware = [
        //other middlewares
        'cors' => 'App\Http\Middleware\CORS',
    ];

Затем вы можете использовать его в своих маршрутах

Route::get('example', array('middleware' => 'cors', 'uses' => '[email protected]'));

Ответ 2

Я всегда использую простой метод. Просто добавьте строки ниже в файл \public\index.php. Мне не нужно использовать промежуточное программное обеспечение.

header('Access-Control-Allow-Origin: *');  
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');

Ответ 3

Я использую Laravel 5.4 и, к сожалению, хотя принятый ответ кажется нормальным, для предварительно $routeMiddleware запросов (таких как PUT и DELETE), которым будет предшествовать запрос OPTIONS, с указанием промежуточного программного обеспечения в массиве $routeMiddleware (и использующего его в файле определения маршрутов) не будет работать, пока вы не определите обработчик маршрута для OPTIONS. Это связано с тем, что без маршрута OPTIONS Laravel будет внутренне отвечать на этот метод без заголовков CORS.

Короче говоря, либо определите промежуточное программное обеспечение в массиве $middleware который выполняется глобально для всех запросов, либо, если вы делаете это в $middlewareGroups или $routeMiddleware то также определите обработчик маршрута для OPTIONS. Это можно сделать так:

Route::match(['options', 'put'], '/route', function () {
    // This will work with the middleware shown in the accepted answer
})->middleware('cors');

Я также написал промежуточное программное обеспечение для той же цели, которое выглядит схожим, но больше по размеру, так как оно пытается быть более настраиваемым и обрабатывает множество условий:

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    private static $allowedOriginsWhitelist = [
      'http://localhost:8000'
    ];

    // All the headers must be a string

    private static $allowedOrigin = '*';

    private static $allowedMethods = 'OPTIONS, GET, POST, PUT, PATCH, DELETE';

    private static $allowCredentials = 'true';

    private static $allowedHeaders = '';

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
      if (! $this->isCorsRequest($request))
      {
        return $next($request);
      }

      static::$allowedOrigin = $this->resolveAllowedOrigin($request);

      static::$allowedHeaders = $this->resolveAllowedHeaders($request);

      $headers = [
        'Access-Control-Allow-Origin'       => static::$allowedOrigin,
        'Access-Control-Allow-Methods'      => static::$allowedMethods,
        'Access-Control-Allow-Headers'      => static::$allowedHeaders,
        'Access-Control-Allow-Credentials'  => static::$allowCredentials,
      ];

      // For preflighted requests
      if ($request->getMethod() === 'OPTIONS')
      {
        return response('', 200)->withHeaders($headers);
      }

      $response = $next($request)->withHeaders($headers);

      return $response;
    }

    /**
     * Incoming request is a CORS request if the Origin
     * header is set and Origin !== Host
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function isCorsRequest($request)
    {
      $requestHasOrigin = $request->headers->has('Origin');

      if ($requestHasOrigin)
      {
        $origin = $request->headers->get('Origin');

        $host = $request->getSchemeAndHttpHost();

        if ($origin !== $host)
        {
          return true;
        }
      }

      return false;
    }

    /**
     * Dynamic resolution of allowed origin since we can't
     * pass multiple domains to the header. The appropriate
     * domain is set in the Access-Control-Allow-Origin header
     * only if it is present in the whitelist.
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function resolveAllowedOrigin($request)
    {
      $allowedOrigin = static::$allowedOrigin;

      // If origin is in our $allowedOriginsWhitelist
      // then we send that in Access-Control-Allow-Origin

      $origin = $request->headers->get('Origin');

      if (in_array($origin, static::$allowedOriginsWhitelist))
      {
        $allowedOrigin = $origin;
      }

      return $allowedOrigin;
    }

    /**
     * Take the incoming client request headers
     * and return. Will be used to pass in Access-Control-Allow-Headers
     *
     * @param  \Illuminate\Http\Request  $request
     */
    private function resolveAllowedHeaders($request)
    {
      $allowedHeaders = $request->headers->get('Access-Control-Request-Headers');

      return $allowedHeaders;
    }
}

Также написано в блоге об этом.

Ответ 4

barryvdh/laravel-cors отлично работает с Laravel 5.1 с несколькими ключевыми моментами в его включении.

  • После добавления в качестве зависимости композитора убедитесь, что вы опубликовали файл конфигурации CORS и скорректировали заголовки CORS, как вы того захотите. Вот как мой взгляд в app/config/cors.php

    <?php
    
    return [
    
        'supportsCredentials' => true,
        'allowedOrigins' => ['*'],
        'allowedHeaders' => ['*'],
        'allowedMethods' => ['GET', 'POST', 'PUT',  'DELETE'],
        'exposedHeaders' => ['DAV', 'content-length', 'Allow'],
        'maxAge' => 86400,
        'hosts' => [],
    ];
    
  • После этого есть еще один шаг, который не упоминается в документации, вам нужно добавить обработчик CORS 'Barryvdh\Cors\HandleCors' в ядро ​​приложения. Я предпочитаю использовать его в глобальном стеке промежуточного программного обеспечения. Как этот

    /**
     * The application global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
        'Illuminate\Cookie\Middleware\EncryptCookies',
        'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
        'Illuminate\Session\Middleware\StartSession',
        'Illuminate\View\Middleware\ShareErrorsFromSession',
    
        'Barryvdh\Cors\HandleCors',
    
    ];
    

    Но это зависит от вас, чтобы использовать его в качестве промежуточного программного обеспечения маршрута и размещать его по определенным маршрутам.

Это должно сделать пакет работы с L5.1

Ответ 5

gostaria que alguem que me ajudasse, есть проблемы с тендо, erro de CORS no laravel 5.1. О, Фасо? Ja tentei quase tudo que encontrei na Internet, mais ele nao funciona. [Requisicao AJAX]

Ответ 6

просто используйте это как промежуточное ПО

<?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', '*');
        $response->header('Access-Control-Allow-Methods', '*');

        return $response;
    }
}

и зарегистрируйте промежуточное ПО в файле ядра по этому пути app/Http/Kernel.php, в какой группе вы предпочитаете, и все будет хорошо