2013-11-04 20 views
6

Sto realizzando un progetto AngularJS, al momento http://localhost con un backend laravel allo http://api.localhost, entrambi serviti da un server nginx.Laravel + AngularJS CORS non funziona

quando si effettua una richiesta di $ http.post, angolare primo fa i OPZIONI CORS chiamano, e ho configurato il mio server nginx per rispondere con le intestazioni appropriate:

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

      ... 
    } 

mio modulo angolare è anche configurato con :

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

opzioni call ritorna come previsto:

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) 

Ma t ha chiamata successiva POST faccio non riesce con uno stato di annullato e angolare genera un errore alla console JS:

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

Ho trascorso la notte scorsa tardi e ottenuto questo lavoro, ma quando ho provato anche oggi, è stato di nuovo per quadrare uno. Peggior tipo di problema!

Cosa fare?

EDIT: Ho trovato il problema, ma continuo a non capirlo. Ho controllato i miei log di accesso di nginx e ho visto che la richiesta POST stava di fatto colpendo il server anche se lo stato era ANNULLATO. Ho anche visto la risposta è stata una 401. Dopo aver ricevuto la mia richiesta corretta, la risposta è stata 201. Ancora lo stesso stato ANNULLATO. Ma quando ho regolato lo stato a 200, voilà! La richiesta ha funzionato come previsto.

C'è una ragione per cui AngularJS accetta solo uno stato 200 in una richiesta di origine incrociata?

+0

versione di nginx? – alfonsodev

+0

stesso problema qui – pajooh

risposta

0

Angular.js $ http il servizio considera valido qualsiasi stato compreso tra 200 e 299 inclusi, è possibile visualizzarlo nel codice sorgente $ http; here e here Non riesco a trovare lo stato 200 hardcoded da nessun'altra parte.

Nonostante il messaggio console Chrome, il problema potrebbe essere qualcosa che Alistair Robinson points in this post Verificare se il nginx è aggiornato all'ultima versione stabile, e quindi controllare se è l'invio di 'Content-Length' intestazione correttamente, se non lo è , Vado con la soluzione Alistair per riempire manualmente intestazione Content-Length.