Laravel 5.1 API Enable Cors

j'ai cherché quelques moyens d'activer le cors sur laravel 5.1 en particulier, j'ai trouvé quelques libs comme:

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

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

mais aucun d'eux N'a de tutoriel d'implémentation spécifique à Laravel 5.1, j'ai essayé de le configurer mais ça ne fonctionne pas.

si quelqu'un a déjà mis en œuvre CORS sur laravel 5.1 je serais reconnaissant pour le aider...

16
demandé sur Matt 2015-10-12 11:40:27

4 réponses

Voici mon middleware 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;
    }

}

pour utiliser CORS middleware, vous devez d'abord l'enregistrer dans votre app\Http\Kernel.fichier php comme ceci:

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

Ensuite, vous pouvez l'utiliser dans vos itinéraires

Route::get('example', array('middleware' => 'cors', 'uses' => 'ExampleController@dummy'));
31
répondu Alex Kyriakidis 2015-10-12 21:27:16

j'utilise toujours une méthode facile. Juste ajouter ci-dessous les lignes \public\index.php fichier. Tu n'es pas obligé d'utiliser un middleware, je pense.

header('Access-Control-Allow-Origin: *');  
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
12
répondu Joel James 2016-01-20 09:13:06

J'utilise Laravel 5.4 et malheureusement bien que la réponse acceptée semble correcte, pour les requêtes préflightées (comme PUT et DELETE) qui sera précédé d'un OPTIONS demande en spécifiant le middleware dans le $routeMiddleware array (et en l'utilisant dans le parcours du fichier de définition) ne fonctionnera pas, sauf si vous définissez un itinéraire gestionnaire pour OPTIONS. C'est parce que sans un OPTIONS route Laravel sera répondre à l'interne à cette méthode sans les CORS tête.

en bref, définissez l'middleware dans le $middleware tableau qui s'exécute globalement pour toutes les requêtes ou si vous le faites dans $middlewareGroups ou $routeMiddleware puis définissez aussi un gestionnaire de route pour OPTIONS. Cela peut être fait comme ceci:

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

j'ai aussi écrit un middleware pour le même but qui semble similaire mais est plus grand en taille car il essaie d'être plus configurable et gère un tas de conditions aussi bien:

<?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;
    }
}

Également écrit un blog sur ce.

2
répondu Rishabh 2017-06-21 18:36:09

barryvdh/laravel-scro fonctionne parfaitement avec Laravel 5.1 avec seulement quelques points clés de l'activation.

  1. après l'avoir ajouté comme dépendance de compositeur, assurez-vous d'avoir publié le fichier de configuration CORS et ajusté les en-têtes CORS comme vous le souhaitez. Voici comment mine de regarder dans app/config / cors.php

    <?php
    
    return [
    
        'supportsCredentials' => true,
        'allowedOrigins' => ['*'],
        'allowedHeaders' => ['*'],
        'allowedMethods' => ['GET', 'POST', 'PUT',  'DELETE'],
        'exposedHeaders' => ['DAV', 'content-length', 'Allow'],
        'maxAge' => 86400,
        'hosts' => [],
    ];
    
  2. Après cela, il y a une étape de plus qui n'est pas mentionné dans la documentation, vous devez ajouter the CORS handler 'Barryvdh\Cors\HandleCors' dans le noyau de L'application. Je préfère l'utiliser dans la pile middleware globale. Comme ceci

    /**
     * The application's 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',
    
    ];
    

    mais c'est à vous de l'utiliser comme middleware de route et de placer sur des routes spécifiques.

cela devrait faire fonctionner le paquet avec L5.1

2
répondu Tariq Khan 2017-12-11 15:24:18