131 votes

Le caractère générique Cors Access-Control-Allow-Headers est-il ignoré?

Je ne parviens pas à faire fonctionner une requête cors entre domaines avec chrome.

En-têtes de demande:

 Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
 

En-têtes de réponse:

 Access-Control-Allow-Headers:*
Access-Control-Allow-Origin:*
Allow:GET, POST, OPTIONS
Content-Length:0
Date:Tue, 30 Oct 2012 20:04:28 GMT
Server:BaseHTTP/0.3 Python/2.7.3
 

Erreur:

 XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
 

Et le code python servant la requête d’options est:

 self.send_response(200)
self.send_header('Allow', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Content-Length', '0')
self.end_headers()
 

Il semble que le caractère générique Access-Control-Allow-Origin soit ignoré?

191voto

monsur Points 8340

L'en-tête Access-Control-Allow-Headers n'autorise pas les caractères génériques. Ce doit être une correspondance exacte: http://www.w3.org/TR/cors/#access-control-allow-headers-response-header

Si vous attendez un grand nombre d'en-têtes, vous pouvez lire la valeur de l'en-tête Access-Control-Request-Headers et renvoyer cette valeur dans l'en-tête Access-Control-Allow-Headers .

17voto

greensuisse Points 512

J'ai trouvé que Access-Control-Allow-d'en-tête: * doit être définie UNIQUEMENT pour les "OPTIONS" de la demande. Si vous le renvoyez par requête POST puis navigateur annuler la demande (au moins pour chrome)

Le code PHP suivant fonctionne pour moi

// Allow CORS
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Headers: *");
}

J'ai trouvé des questions similaires, avec quelques trompeuse réponse:

  • Server thread dit que c'est 2 ans de bug de chrome: Access-Control-Allow-les en-Têtes ne correspond pas à localhost. C'est faux: je peux utiliser de la SCRO à mon serveur local avec la Poste normalement
  • Access-Control-Allow-en-Têtes de n'accepter des caractères génériques. Il est également faux, générique fonctionne pour moi (je l'ai testé uniquement avec Chrome)

Cela me prendre une demi-journée pour déterminer le problème.

Bon codage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X