Von dem, was ich gelesen habe über CORS, verstehe ich es funktionieren soll wie folgt:CORS: Warum sendet mein Browser keine OPTIONS Preflight Anfrage?
- Script auf einer Client-Seite eine Ressource von einem Server mit unterschiedlicher Herkunft zu zu holen versucht.
- Browser fängt diese Anfrage ab und macht zuerst Preflight OPTIONS Anfrage an die gleiche URL.
- Wenn Antwort auf diese Preflight-Anforderung enthält entsprechende Header (z
Access-Control-Allow-Origin: *
), Browser versteht es Haupt-Anfrage zu senden ist erlaubt und es tut. - Antwort wird an das Clientskript zurückgegeben.
Ich habe einen Test für es wie folgt aufgebaut:
- Server in beide gehen zu akzeptieren - GET und OPTIONS-Requests (geprüft cURL) - und Einstellung
Access-Control-*
Header in Reaktion einfache HTML-Seite mit dem folgenden Skript drin (
$
steht für jQuery) (von einem anderen Server auf einem anderen Port serviert):$.ajax({ type: "GET", crossDomain: true, url: "http://local.site.com/endpoint, success: function (data) { alert(data); }, error: function (request, error) { alert(error); } });
Wenn ich diese Methode aufrufen, aber ich sehe nur eine GET und keine Preflight-OPTIONS-Anforderung in der Registerkarte Netzwerk in beiden - Chrome 49 und Firefox 33.
Hier sind Details meiner GET-Anfrage von Chrome:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ru;q=0.6
Connection:keep-alive
Host:local.adform.com
Origin:http://localhost:7500
Referer:http://localhost:7500/test-page.html
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
und entsprechende Antwort:
Access-Control-Allow-Headers:Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Content-Length:2
Content-Type:text/plain; charset=utf-8
Date:Wed, 03 Aug 2016 10:53:19 GMT
Irgendwelche Gedanken auf warum meinem Browser (n) nicht Preflight senden Anfrage?
Preflight ist nicht immer möglich, weniger wahrscheinlich (wenn überhaupt?) Mit einem GET - siehe [Dokumentation] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) wenn Preflight erforderlich ist –
Siehe [this] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) für weitere Informationen darüber, wann ein Browser eine Preflight-Anfrage absetzt. – robertklep
@ JaromandaX: Danke für die Bemerkung. Wenn eine Preflight-Anforderung nicht immer erforderlich ist, was ist der (herkömmliche) Weg zur Überwindung der "source-origin" -Richtlinie? Das Szenario ist: Wir erstellen ein Skript, das in Websites von Drittanbietern integriert wird und uns _our_ cookies senden wird? Soweit ich weiß, wird ohne Preflight Request Browser keine Cookies an unsere Server senden, oder? – ffriend