Laravel + AngularJS CORS ne fonctionne pas

Je fais un projet AngularJS, maintenant à http://localhost avec un backend laravel à http://api.localhost , les deux servis par un serveur nginx.

Lors d’une requête $ http.post, angular effectue d’abord l’appel CORS OPTIONS, et j’ai configuré mon serveur nginx pour qu’il réponde avec les en-têtes appropriés:

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

Mon module angular est également configuré avec:

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

L’appel OPTIONS renvoie comme prévu:

 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) 

Mais l’appel ultérieur du POST que j’effectue échoue avec un statut CANCELED et l’angle angular jette une erreur sur la console JS:

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

Je suis restée éveillée tard hier soir et je me suis mise au travail, mais quand j’ai essayé à nouveau aujourd’hui, c’était de retour à la case départ. Le pire genre de problème!

Qu’est-ce que?

EDIT: J’ai trouvé le problème, mais je ne le comprends toujours pas. J’ai regardé mes journaux d’access nginx et j’ai vu que la requête POST frappait le serveur même si l’état était ANNULÉ. J’ai également vu que la réponse était un 401. Après avoir reçu ma demande, la réponse était 201. Toujours le même statut ANNULÉ. Mais quand j’ai ajusté le statut à 200, le tour est joué! La demande a fonctionné comme prévu.

Y a-t-il une raison pour laquelle AngularJS n’accepte qu’un statut 200 dans une demande d’origine croisée?

Le service Angular.js $ http considère comme valide tout statut compris entre 200 et 299 inclus, vous pouvez le voir dans le code source $ http; ici et là je ne trouve pas le statut 200 codé en dur ailleurs.

Malgré le message de la console Chrome, le problème pourrait être quelque chose que Alistair Robinson signale dans cet article Vérifiez si votre version de nginx est mise à jour vers la dernière version stable, puis vérifiez si elle envoie correctement l’en-tête Content-Length. Utilisez la solution Alistair pour remplir manuellement l’en-tête Content-Length.