Mam problem z poprawnym działaniem żądania CORS między domenami w przeglądarce Chrome.
Nagłówki żądań:
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
Nagłówki odpowiedzi:
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
Błąd:
XMLHttpRequest cannot load domain. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.
A kod Pythona obsługujący żądanie opcji to:
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()
Wygląda na to, że Access-Control-Allow-Origin
symbol wieloznaczny jest ignorowany?
Te nagłówki CORS nie obsługują
*
jako wartości, jedynym sposobem jest zastąpienie*
tym: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
Przykład (w tym CORS):FAQ:
Dlaczego
Access-Control-Allow-Headers
,Access-Control-Expose-Headers
,Access-Control-Allow-Methods
wartości są bardzo długo?Nie obsługują one
*
składni, więc zebrałem najpopularniejsze (i egzotyczne) nagłówki z całej sieci, w różnych formatach # 1 # 2 # 3 (i będę aktualizować listę od czasu do czasu)Dlaczego używasz
Header unset ______
składni?Serwery GoDaddy (na których hostowana jest moja witryna ...) mają dziwny błąd polegający na tym, że jeśli nagłówki są już ustawione, poprzednia wartość dołączy do istniejącej .. (zamiast ją zastąpić) w ten sposób „wstępnie wyczyszczę” istniejące wartości (naprawdę tylko szybkie i brudne rozwiązanie)
Czy mogę bezpiecznie używać „tak jak jest”?
No cóż… w większości odpowiedź brzmiałaby TAK, ponieważ
.htaccess
ogranicza nagłówki do skryptów (PHP, HTML, ...) i zasobów (.JPG, .JS, .CSS) obsługiwanych z następującej lokalizacji „folderu”. Opcjonalnie możesz chcieć usunąćAccess-Control-Allow-Methods
linie. RównieżConnection
,Time-Zone
,Keep-Alive
iDNT
,Accept-Ranges
,Vary
,X-UA-Compatible
,X-Frame-Options
,X-Content-Type-Options
iX-Xss-Protection
to tylko sugestia używam dla mojej Online-Service .. krępuj się usunąć te zbyt ...zaczerpnięte z mojego komentarza powyżej
źródło
Access-Control-Allow-Origin "*"
ale nic nie działało, dopóki tego nie użyłem. Nawet dostawca CDN nie miał dla nas odpowiedzi. Stronę internetową prowadzę w Siteground , być może jako GoDaddy trzeba najpierw wszystko rozbroić.Access-Control-Allow-Methods
wszystkich tych metod: HTTP / 0.9, HTTP / 1.0, HTTP / 1.1, HTTP / 2Odkryłem, że
Access-Control-Allow-Headers: *
powinno to być ustawione TYLKO dla żądania OPCJI. Jeśli zwrócisz go dla żądania POST, przeglądarka anuluje żądanie (przynajmniej w przypadku Chrome)Poniższy kod PHP działa dla mnie
Znalazłem podobne pytania z pewną mylącą odpowiedzią:
Access-Control-Allow-Headers
nie pasuje do localhost. Jest źle: mogę normalnie używać CORS do mojego lokalnego serwera z PostAccess-Control-Allow-Headers
akceptuje symbole wieloznaczne. Jest też źle, dla mnie działa wieloznacznik (testowałem tylko z Chrome)Zajęło mi to pół dnia, aby rozwiązać problem.
Miłego kodowania
źródło
*
naAccess-Control-Allow-Headers
nawetOPTIONS
.Cytat za monsur,
Oto moje rozwiązanie php.
źródło
header('Access-Control-Allow-Headers: ' . $_SERVER['HTTP_ACCESS_CONTROL_ALLOW_HEADERS']);
oto inkantacja dla nginx, wewnątrz a
źródło