Tengo problemas para que una solicitud CORS entre dominios funcione correctamente con Chrome.
Solicitar encabezados:
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
Encabezados de respuesta:
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
Error:
XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
Y el código Python que atiende la solicitud de opciones es:
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()
¿Parece que Access-Control-Allow-Origin
se está ignorando el comodín?
Esos encabezados CORS no se admiten
*
como valor, la única forma es reemplazarlos*
con esto: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
Ejemplo (CORS incluido):PREGUNTAS MÁS FRECUENTES:
¿Por qué
Access-Control-Allow-Headers
,Access-Control-Expose-Headers
,Access-Control-Allow-Methods
los valores son súper larga?Esos no admiten la
*
sintaxis, por lo que he recopilado los encabezados más comunes (y exóticos) de la web, en varios formatos # 1 # 2 # 3 (y actualizaré la lista de vez en cuando)¿Por qué usas la
Header unset ______
sintaxis?Los servidores de GoDaddy (en los que está alojado mi sitio web ...) tienen un error extraño en el que, si los encabezados ya están configurados, el valor anterior se unirá al existente ... (en lugar de reemplazarlo) de esta manera "pre-limpio" los valores existentes (realmente solo una solución rápida y sucia )
¿Es seguro para mí usarlo "tal cual"?
Bueno ... principalmente la respuesta sería SÍ, ya que
.htaccess
está limitando los encabezados a los scripts (PHP, HTML, ...) y recursos (.JPG, .JS, .CSS) servidos desde la siguiente ubicación de "carpeta". Opcionalmente, es posible que desee eliminar lasAccess-Control-Allow-Methods
líneas. TambiénConnection
,Time-Zone
,Keep-Alive
yDNT
,Accept-Ranges
,Vary
,X-UA-Compatible
,X-Frame-Options
,X-Content-Type-Options
yX-Xss-Protection
son sólo una sugerencia que estoy usando para mi servicio en línea .. no dude en eliminar los que son demasiado ...tomado de mi comentario anterior
fuente
Access-Control-Allow-Origin "*"
pero nada funcionó hasta que usé esto. Ni siquiera el proveedor de CDN tenía una respuesta para nosotros. Ejecuto el sitio web en Siteground , tal vez, como GoDaddy , es obligatorio desarmar primero todo.Access-Control-Allow-Methods
todos estos métodos: HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2Descubrí que
Access-Control-Allow-Headers: *
debería configurarse SOLO para la solicitud de OPCIONES. Si lo devuelve para la solicitud POST, el navegador cancela la solicitud (al menos para Chrome)El siguiente código PHP funciona para mí
Encontré preguntas similares con alguna respuesta engañosa:
Access-Control-Allow-Headers
no coincide con localhost. Está mal: puedo usar CORS en mi servidor local con Post normalmenteAccess-Control-Allow-Headers
acepta comodines. También está mal, el comodín funciona para mí (solo probé con Chrome)Esto me lleva medio día resolver el problema.
Codificación feliz
fuente
*
enAccess-Control-Allow-Headers
incluso paraOPTIONS
.Citado de monsur,
Así que aquí está mi solución php.
fuente
header('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
aquí está el encantamiento para nginx, dentro de un
fuente