2013-01-19 14 views
18

Ich entwickle eine angularjs App, die Laravel als Back-End-Server verwendet. Ich habe Probleme jede Anforderung erhalten, da, bevor Daten von Laravel Zugriff Winkel ersten sendet eine OPTION Anfrage wie untenLaravel Umgang mit der OPTION http Methode Anfrage

OPTIONS /61028/index.php/api/categories HTTP/1.1 
Host: localhost 
Connection: keep-alive 
Cache-Control: max-age=0 
Access-Control-Request-Method: GET 
Origin: http://localhost:3501 
Access-Control-Request-Headers: origin, x-requested-with, accept 
Accept: */* 
Referer: http://localhost:3501/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: UTF-8,*;q=0.5 

I haben versucht, diese durch, bevor der Filter in der Zugabe von den folgenden Code zu antworten

if (Request::getMethod() == "OPTIONS") { 
    $headers = array(
     'Access-Control-Allow-Origin' =>' *', 
     'Access-Control-Allow-Methods'=>' POST, GET, OPTIONS, PUT, DELETE', 
     'Access-Control-Allow-Headers'=>'X-Requested-With, content-type',); 
     return Response::make('', 200, $headers); 
    } 

Dies erzeugt eine Antwort mit den Headern

Content-Encoding: gzip 
X-Powered-By: PHP/5.3.5-1ubuntu7.11 
Connection: Keep-Alive 
Content-Length: 20 
Keep-Alive: timeout=15, max=97 
Server: Apache/2.2.17 (Ubuntu) 
Vary: Accept-Encoding 
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE 
Content-Type: text/html; charset=UTF-8 
access-control-allow-origin: * 
cache-control: no-cache 
access-control-allow-headers: X-Requested-With, content-type 

Obwohl die Header gesetzt sind, führt der Browser immer noch einen Fehler

XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin. 

ich auch der Ursprung auf den Ursprung im Request-Header präsentiert erlauben versucht haben, Einstellung wie unten

$origin=Request::header('origin'); 
    //then within the headers 
    'Access-Control-Allow-Origin' =>' '.$origin[0], 

und immer noch die gleichen Fehler Was mache ich falsch? Jede Hilfe wird sehr geschätzt.

Edit 1

ich zur Zeit eine sehr hässliche Hack bin mit dem ich über-ride Initialisierung laravels, wenn eine Anfrage OPTIONEN empfangen wird. Dies habe ich in der index.php gemacht.

Ich musste auch die Zulassen-Herkunft-Header zum Vor-Filter hinzufügen.

Ich weiß, das ist nicht klug, aber es ist meine einzige Lösung für die jetzt

+0

Ich bin mir ziemlich sicher, dass in der index.php hinzufügen, wenn ich das versucht, fand ich, dass einige Browser das Gehäuse korrekt zu sein, erfordern aus. Sieht so aus, als würde Laravel alles unterlegen, was technisch in Ordnung ist, aber immer noch fehlschlagen kann. – Evert

+0

@Evert ich bemerkte das und dachte über die eingebaute php 'header()' Funktion nach. Das Problem ist jedoch immer noch hartnäckig. – klvmungai

+0

Das ist dann seltsam. Stellen Sie außerdem sicher, dass Sie alle diese Header für die Anforderungen GET, PUT, DELETE und POST zurücksenden? Es ist erforderlich .. – Evert

Antwort

2

Dies ist mit Bezug auf Ihre Frage in Bezug auf das oben genannte Problem. Sie haben die Version von Laravel und angularJS nicht erwähnt. Ich nehme an, Sie verwenden Lattest angularJS und Laravel. Ich nehme auch an, dass der Winkel ist gehostet auf http: // localhost: 3501 und der Laravel gehostet wird auf http: // localhost Folgen Sie einfach den folgenden Schritten.

  • unter Codeblock Setzen Sie in /public/.htaccess Datei von Laravel

    Header set Access-Control-Allow-Origin "http://localhost:3501" 
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" 
    Header set Access-Control-Allow-Credentials "true" 
    
  • unterhalb der Linie in config Winkel

    $httpProvider.defaults.withCredentials = true; 
    
Put

Niemals * als Wildcard-Charakter. Larvel kann die Domäne für die Sitzungsverwaltung nicht identifizieren. Setzen Sie daher http: // localhost: 3501 als vollständigen Domänennamen auf Access-Control-Allow-Origin. Ich denke, das wird dir helfen.

0

Es ist ein Fehler in Laravel, die vor kurzem fixed bekam. Möglicherweise möchten Sie auf die neueste Version aktualisieren.

Außerdem müssen Sie die CORS-Unterstützung für Ihren Server aktivieren.

+0

Vielen Dank .. kann jetzt den hässlichen Code loswerden – klvmungai

+0

Was bedeutet "Sie müssen CORS Unterstützung für Ihren Server aktivieren" bedeuten, obwohl? –

+1

http://enable-cors.org/ –

-2

diese

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); 
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');