J'ai du mal à faire fonctionner correctement une requête CORS interdomaine 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 demande 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 Access-Control-Allow-Origin
joker est ignoré?
Ces en-têtes CORS ne prennent pas en charge en
*
tant que valeur, le seul moyen est de les remplacer*
par ceci:Accept, Accept-CH, Accept-Charset, Accept-Datetime, Accept-Encoding, Accept-Ext, Accept-Features, Accept-Language, Accept-Params, Accept-Ranges, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Expose-Headers, Access-Control-Max-Age, Access-Control-Request-Headers, Access-Control-Request-Method, Age, Allow, Alternates, Authentication-Info, Authorization, C-Ext, C-Man, C-Opt, C-PEP, C-PEP-Info, CONNECT, Cache-Control, Compliance, Connection, Content-Base, Content-Disposition, Content-Encoding, Content-ID, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Script-Type, Content-Security-Policy, Content-Style-Type, Content-Transfer-Encoding, Content-Type, Content-Version, Cookie, Cost, DAV, DELETE, DNT, DPR, Date, Default-Style, Delta-Base, Depth, Derived-From, Destination, Differential-ID, Digest, ETag, Expect, Expires, Ext, From, GET, GetProfile, HEAD, HTTP-date, Host, IM, If, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Keep-Alive, Label, Last-Event-ID, Last-Modified, Link, Location, Lock-Token, MIME-Version, Man, Max-Forwards, Media-Range, Message-ID, Meter, Negotiate, Non-Compliance, OPTION, OPTIONS, OWS, Opt, Optional, Ordering-Type, Origin, Overwrite, P3P, PEP, PICS-Label, POST, PUT, Pep-Info, Permanent, Position, Pragma, ProfileObject, Protocol, Protocol-Query, Protocol-Request, Proxy-Authenticate, Proxy-Authentication-Info, Proxy-Authorization, Proxy-Features, Proxy-Instruction, Public, RWS, Range, Referer, Refresh, Resolution-Hint, Resolver-Location, Retry-After, Safe, Sec-Websocket-Extensions, Sec-Websocket-Key, Sec-Websocket-Origin, Sec-Websocket-Protocol, Sec-Websocket-Version, Security-Scheme, Server, Set-Cookie, Set-Cookie2, SetProfile, SoapAction, Status, Status-URI, Strict-Transport-Security, SubOK, Subst, Surrogate-Capability, Surrogate-Control, TCN, TE, TRACE, Timeout, Title, Trailer, Transfer-Encoding, UA-Color, UA-Media, UA-Pixels, UA-Resolution, UA-Windowpixels, URI, Upgrade, User-Agent, Variant-Vary, Vary, Version, Via, Viewport-Width, WWW-Authenticate, Want-Digest, Warning, Width, X-Content-Duration, X-Content-Security-Policy, X-Content-Type-Options, X-CustomHeader, X-DNSPrefetch-Control, X-Forwarded-For, X-Forwarded-Port, X-Forwarded-Proto, X-Frame-Options, X-Modified, X-OTHER, X-PING, X-PINGOTHER, X-Powered-By, X-Requested-With
.htaccess
Exemple (CORS inclus):FAQ:
Pourquoi
Access-Control-Allow-Headers
,Access-Control-Expose-Headers
, lesAccess-Control-Allow-Methods
valeurs sont super long?Ceux-ci ne prennent pas en charge la
*
syntaxe, j'ai donc rassemblé les en-têtes les plus courants (et exotiques) du Web, dans divers formats # 1 # 2 # 3 (et je mettrai à jour la liste de temps en temps)Pourquoi utilisez-vous la
Header unset ______
syntaxe?Les serveurs GoDaddy (sur lesquels mon site Web est hébergé ..) ont un bogue étrange où si les en-têtes sont déjà définis, la valeur précédente rejoindra celle existante .. (au lieu de la remplacer) de cette façon, je "pré-nettoie" les valeurs existantes (vraiment juste une solution rapide et sale )
Puis-je utiliser «tel quel» en toute sécurité?
Eh bien ... la plupart du temps, la réponse serait OUI puisque la
.htaccess
limite les en-têtes aux scripts (PHP, HTML, ...) et aux ressources (.JPG, .JS, .CSS) servis à partir de l'emplacement de "dossier" suivant. Vous pouvez éventuellement supprimer lesAccess-Control-Allow-Methods
lignes. En outreConnection
,Time-Zone
,Keep-Alive
etDNT
,Accept-Ranges
,Vary
,X-UA-Compatible
,X-Frame-Options
,X-Content-Type-Options
etX-Xss-Protection
sont juste une suggestion que je utilise pour mon service en ligne .. vous pouvez retirer ceux qui sont trop ...tiré de mon commentaire ci-dessus
la source
Access-Control-Allow-Origin "*"
mais rien ne fonctionnait jusqu'à ce que je l'utilise. Même le fournisseur de CDN n'avait pas de réponse pour nous. Je dirige le site Web dans Siteground , peut-être, en tant que GoDaddy , il est obligatoire de tout débloquer d'abord.Access-Control-Allow-Methods
toutes ces méthodes: HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2J'ai trouvé que cela
Access-Control-Allow-Headers: *
devrait être défini UNIQUEMENT pour la demande OPTIONS. Si vous le renvoyez pour une demande POST, le navigateur annule la demande (au moins pour Chrome)Le code PHP suivant fonctionne pour moi
J'ai trouvé des questions similaires avec des réponses trompeuses:
Access-Control-Allow-Headers
ne correspond pas à localhost. C'est faux: je peux utiliser CORS sur mon serveur local avec Post normalementAccess-Control-Allow-Headers
accepte les caractères génériques. C'est également faux, le joker fonctionne pour moi (j'ai testé uniquement avec Chrome)Cela me prend une demi-journée pour résoudre le problème.
Bon codage
la source
*
leAccess-Control-Allow-Headers
mêmeOPTIONS
.Cité de Monsur,
Voici donc ma solution php.
la source
header('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
voici l'incantation pour nginx, à l'intérieur d'un
la source