L’en-tête Access-Control-Allow-Origin ne fonctionne pas – Qu’est-ce que je fais de travers?

Je tente de fournir une réponse à la méthode HTTP OPTIONS avec un en-tête Access-Control-Allow-Origin copiant le contenu de l’en-tête Origin dans la demande.

Cela ne fonctionne apparemment pas, pour des raisons que je ne comprends pas.

tl; dr: la réponse de OPTIONS dit:

Access-Control-Allow-Origin: http://10.0.0.105:9294 

GET ultérieur a:

 Origin:http://10.0.0.105:9294 

Chrome dit:

 Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin 

WTF pas?

Plus de détails…

En regardant dans la fenêtre des outils de développement de Chrome, les en-têtes de requête sont les suivants:

 OPTIONS /user/kris HTTP/1.1 Host: 10.0.0.104:8080 Connection: keep-alive Access-Control-Request-Method: GET Origin: http://10.0.0.105:9294 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1 Access-Control-Request-Headers: origin, x-requested-with, content-type, accept Accept: */* Referer: http://10.0.0.105:9294/ Accept-Encoding: gzip,deflate,sdch Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Les en-têtes de réponse sont:

 HTTP/1.0 200 OK Date: Mon, 13 Aug 2012 11:23:45 GMT Server: WSGIServer/0.1 Python/2.7.3 Content-Length: 0 Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS Access-Control-Max-Age: 10 Access-Control-Allow-Origin: http://10.0.0.105:9294 Access-Control-Allow-Headers: X-Requested-With, Authorization, X-Huzu-User, Content-Type, Accept Content-Type: text/html; charset=UTF-8 

Une fois que jQuery a envoyé sa demande OPTIONS et obtenu la réponse ci-dessus, 2 événements étranges se produisent. La réponse OPTIONS (200) s’affiche dans la console du développeur sous forme d’erreur:

 OPTIONS http://10.0.0.104:8080/user/kris 200 (OK) 

Après quoi une demande GET est rejetée. Erreur dans la console:

 XMLHttpRequest cannot load http://10.0.0.104:8080/user/kris. Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin. 

Je ne vois pas pourquoi pas. Qu’est-ce que je fais mal?

OK, je pense que je l’ai. Il semble que le traitement correct de la demande OPTIONS avant le vol soit nécessaire, mais PAS SUFFISANT pour que les demandes de ressources inter-sites fonctionnent.

Une fois que la demande OPTIONS a été renvoyée avec des en-têtes satisfaisants, toutes les réponses aux demandes ultérieures adressées à la même URL doivent également posséder l’en-tête “Access-Control-Allow-Origin” nécessaire. Dans le cas contraire, le navigateur les avalera, sans même les renvoyer. afficher dans la fenêtre du débogueur.

Il semblerait donc que le navigateur ait annulé la demande à cause d’un problème dans la réponse OPTIONS, mais en réalité, le navigateur examine les en-têtes de réponse de la demande réelle, puis les rejette.