2013-11-04 13 views
6

Ich mache ein AngularJS-Projekt, jetzt unter http://localhost mit einem Laravel-Backend unter http://api.localhost, beide von einem Nginx-Server bedient.Laravel + AngularJS CORS funktioniert nicht

wenn ein $ http.post antrag, Winkel erste macht die CORS OPTIONS anrufen, und ich habe meine nginx-Server konfiguriert mit den richtigen Header zu reagieren:

location/{ 
      add_header "Access-Control-Allow-Origin" "*"; 
      add_header "Access-Control-Allow-Credentials" "true"; 
      add_header "Access-Control-Allow-Methods" "GET,POST,DELETE,PUT,OPTIONS"; 
      add_header "Access-Control-Allow-Headers" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization"; 
      add_header "Access-Control-Max-Age" "1728000"; 

      if ($request_method = 'OPTIONS') { 
        return 204; 
      } 


      #try_files $uri $uri/ /index.html; 
      try_files $uri /index.php?$query_string; 
    } 

    location = /index.php { 

      add_header "Access-Control-Allow-Origin" "*"; 
      add_header "Access-Control-Allow-Credentials" "true"; 
      add_header "Access-Control-Allow-Methods" "GET,POST,DELETE,PUT,OPTIONS"; 
      add_header "Access-Control-Allow-Headers" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization"; 
      add_header "Access-Control-Max-Age" "1728000"; 

      if ($request_method = 'OPTIONS') { 
        return 204; 
      } 

      ... 
    } 

Mein Winkelmodul auch mit so konfiguriert ist, :

.config(['$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.useXDomain = true; 
    delete $httpProvider.defaults.headers.common['X-Requested-With']; 
}]) 

Die OPTIONS-Aufruf kehrt wie erwartet:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization 
Access-Control-Allow-Methods:GET,POST,DELETE,PUT,OPTIONS 
Access-Control-Allow-Origin:* 
Access-Control-Max-Age:1728000 
Connection:keep-alive 
Date:Mon, 04 Nov 2013 02:14:16 GMT 
Server:nginx/1.2.6 (Ubuntu) 

Aber t er nachfolgender POST Anruf Ich mache nicht mit einem Status von ABGESAGT und Winkel wirft einen Fehler an die JS-Konsole:

`XMLHttpRequest cannot load http://api.localhost/users/accesstokens. Origin http://localhost is not allowed by Access-Control-Allow-Origin.` 

ich spät in der Nacht aufgeblieben und bekam diese Arbeit, aber wenn ich heute wieder versucht, es war wieder um eins zu machen. Schlimmste Art von Problem!

Was tun?

EDIT: Ich habe das Problem gefunden, aber ich verstehe es immer noch nicht. Ich schaute auf meine Nginx-Zugriffsprotokolle und sah, dass die POST-Anfrage tatsächlich den Server erreichte, obwohl der Status CANCELLED war. Ich sah auch, dass die Antwort eine 401 war. Nachdem meine Anfrage korrekt war, war die Antwort 201. Immer noch derselbe CANCELED-Status. Aber als ich den Status auf 200 eingestellt habe, voila! Die Anfrage funktionierte wie beabsichtigt.

Gibt es einen Grund, warum AngularJS nur einen 200-Status in einer ursprungsübergreifenden Anforderung akzeptiert?

+0

Version von Nginx? – alfonsodev

+0

das gleiche Problem hier – pajooh

Antwort

0

Angular.js $ http-Dienst gilt als gültig jeder Status zwischen 200 und 299 einschließlich, Sie können es im $ http Quellcode sehen; here und here Ich kann den Status 200 nicht anderswo hardcoded finden.

Trotz der Chrome Konsolenmeldung, könnte das Problem etwas sein, dass Alistair Robinson points in this post Überprüfen Sie, ob Ihre nginx auf die neueste stabile Version aktualisiert wird, und dann prüfen, ob es richtig Header ‚Content-Length‘ sendet, wenn es nicht ist , Gehe ich mit der Alistair-Lösung, um Content-Length-Header manuell zu füllen.