Estou tendo problemas para fazer com que uma solicitação CORS entre domínios funcione corretamente usando o Chrome.
Solicitar cabeçalhos:
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
Cabeçalhos de resposta:
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
Erro:
XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
E o código Python que atende à solicitação de opçõ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 o Access-Control-Allow-Origin
curinga está sendo ignorado?
Esses cabeçalhos CORS não suportam
*
como valor, a única maneira é substituí-los*
por: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
Exemplo (CORS incluído):PERGUNTAS FREQUENTES:
Por que
Access-Control-Allow-Headers
,Access-Control-Expose-Headers
,Access-Control-Allow-Methods
valores são super longa?Eles não suportam a
*
sintaxe, então eu coletei os cabeçalhos mais comuns (e exóticos) de toda a web, em vários formatos # 1 # 2 # 3 (e irei atualizar a lista de tempos em tempos)Por que você usa
Header unset ______
sintaxe?Os servidores GoDaddy (nos quais meu site está hospedado ..) têm um bug estranho onde se os cabeçalhos já estiverem configurados, o valor anterior irá se juntar ao existente .. (em vez de substituí-lo) desta forma eu "pré-limpo" os valores existentes (na verdade apenas uma solução rápida e suja )
É seguro usar "no estado em que se encontra"?
Bem ... principalmente a resposta seria SIM, pois
.htaccess
está limitando os cabeçalhos aos scripts (PHP, HTML, ...) e recursos (.JPG, .JS, .CSS) servidos a partir da seguinte "pasta" -local. Opcionalmente, você pode querer remover asAccess-Control-Allow-Methods
linhas. Além dissoConnection
,Time-Zone
,Keep-Alive
eDNT
,Accept-Ranges
,Vary
,X-UA-Compatible
,X-Frame-Options
,X-Content-Type-Options
eX-Xss-Protection
são apenas uma sugestão que eu estou usando para o meu serviço online .. sinta-se livre para remover os demais ...tirado do meu comentário acima
fonte
Access-Control-Allow-Origin "*"
mas nada funcionou até que usei isso. Nem mesmo o provedor de CDN tinha uma resposta para nós. Eu corro o site em Siteground , talvez, como GoDaddy , seja obrigatório desmarcar primeiro tudo.Access-Control-Allow-Methods
todos estes métodos: HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2Achei que
Access-Control-Allow-Headers: *
deveria ser definido SOMENTE para a solicitação de OPÇÕES. Se você devolvê-lo para a solicitação POST, o navegador cancela a solicitação (pelo menos para o Chrome)O seguinte código PHP funciona para mim
Encontrei perguntas semelhantes com algumas respostas enganosas:
Access-Control-Allow-Headers
não corresponde ao localhost. Está errado: posso usar CORS para meu servidor local com Post normalmenteAccess-Control-Allow-Headers
aceita curingas. Também está errado, curinga funciona para mim (eu testei apenas com o Chrome)Isso me leva meio dia para descobrir o problema.
Boa codificação
fonte
*
noAccess-Control-Allow-Headers
mesmo paraOPTIONS
.Citado de Monsur,
Então aqui está minha solução de php.
fonte
header('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
aqui está o encantamento para nginx, dentro de um
fonte