2015-10-12 15 views
11

Ich habe für einige Möglichkeiten gesucht cors auf Laravel 5.1 speziell zu ermöglichen, habe ich einige Libs wie gefunden Implementierung Tutorial speziell für Laravel 5.1, habe ich versucht zu konfigurieren, aber es funktioniert nicht.Laravel 5.1 API aktivieren Cors

Wenn jemand bereits umgesetzt CORS auf Laravel 5.1 ich für die Hilfe dankbar sein würde ...

+0

Barryvdhs ist für Laravel 5, und wirklich sollte es aus der Box mit 5.1 auch funktionieren. Hast Du es versucht? – Dencker

+0

Ja, ich habe versucht, aber ich bekomme immer noch die folgende Nachricht (es ist ein eckiges Frontend) XMLHttpRequest kann http://api.address.com nicht laden. Kein 'Access-Control-Allow-Origin'-Header ist auf der angeforderten Ressource vorhanden. Origin 'http://127.0.0.1:8080' ist daher nicht erlaubt. Aber ich habe hinzugefügt, die bereits die lokale Adresse auf den cors Dateien 'supportsCredentials' => true, 'allowedOrigins' => [ 'http://127.0.0.1:8080'], 'allowedHeaders' => [ '*'], 'allowedMethods' => ['GET', 'POST', 'PUT', 'LÖSCHEN'], 'exposedHeaders' => [], 'maxAge' => 0, 'Hosts' => [], –

+0

Welche Nachricht erhalten Sie? – Dencker

Antwort

23

Hier ist meine CORS-Middleware:

<?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 Middleware nutzen zu können, es müssen sich registrieren in Ihre app \ Http \ Kernel.php wie diese Datei:

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

Dann können Sie es in Ihre Routen verwenden

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

Works auf Apache aber nicht IIS :(​​ – suncoastkid

+2

Nur um zu klären - ist dies eine Alternative zu den in der Frage genannten Pakete? – retrograde

+3

@retrograde ja, wenn Sie diese Lösung wählen, müssen Sie kein Paket verwenden. –

8

Ich benutze immer eine einfache Methode. Fügen Sie einfach die folgenden Zeilen zur Datei \public\index.php hinzu. Sie müssen keine Middleware verwenden, denke ich.

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

ist es nicht elegant –

+1

@EfriandikaPratama warum nicht? Die Datei 'index.php' wird für alle HTTP-Anfragen verwendet. Es ist also ein einfacher und benutzerfreundlicher Weg. –

+0

Es ist nicht elegant. Eleganter, wenn Sie diesen Code in Middleware einfügen. –

2

barryvdh/laravel-cors funktioniert perfekt mit Laravel 5.1 mit nur ein paar wichtigen Punkten bei der Aktivierung.

  1. Nachdem er als Komponist Abhängigkeit hinzufügen, stellen Sie sicher, dass Sie die CORS Config-Datei veröffentlicht haben und die CORS-Header eingestellt, wie Sie wollen. Hier ist, wie mein Blick in app/config/cors.php

    <?php 
    
    return [ 
    
        'supportsCredentials' => true, 
        'allowedOrigins' => ['*'], 
        'allowedHeaders' => ['*'], 
        'allowedMethods' => ['GET', 'POST', 'PUT', 'DELETE'], 
        'exposedHeaders' => ['DAV', 'content-length', 'Allow'], 
        'maxAge' => 86400, 
        'hosts' => [], 
    ]; 
    
  2. Danach gibt es ein mehr Schritt die in der Dokumentation nicht erwähnt wird, müssen Sie die CORS-Handler 'Barryvdh\Cors\HandleCors' im App-Kernel hinzufügen . Ich bevorzuge es im globalen Middleware-Stack zu verwenden. So ist es

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

    Aber es ist an Ihnen, es als eine Route Middleware und Ort auf bestimmten Routen zu verwenden.

Dies sollte das Paket Arbeit mit L5.1

1

Ich verwende Laravel 5.4 und leider machen, obwohl scheint die akzeptierte Antwort in Ordnung, für Preflight-Anforderungen (wie PUT und DELETE), die durch eine vorangehen wird OPTIONS Anfrage, Angabe der Middleware in der $routeMiddleware Array (und mit dieser in der Routen Definitionsdatei) funktioniert nicht, es sei denn, Sie definieren auch eine Route-Handler für OPTIONS. Dies ist, weil ohne OPTIONS Route Laravel internally respond zu dieser Methode ohne die CORS-Header.

Also kurz gesagt entweder die Middleware in den $middleware Array definieren, die für alle Anforderungen global läuft oder wenn Sie es in $middlewareGroups oder $routeMiddleware tun dann auch eine Route Handler für OPTIONS definieren.Dies kann wie folgt geschehen:

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

ich auch eine Middleware für den gleichen Zweck schrieb, das ähnlich aussieht, aber größer, da es versucht, mehr konfigurierbar zu sein und übernimmt eine Reihe von Bedingungen auch:

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

Auch eine blog post auf diese geschrieben.