Access-Control-Allow-Origin
ist ein CORS-Header (Cross-Origin Resource Sharing) .
Wenn Site A versucht, Inhalte von Site B abzurufen, kann Site B einen Access-Control-Allow-Origin
Antwortheader senden , um dem Browser mitzuteilen, dass der Inhalt dieser Seite für bestimmte Ursprünge zugänglich ist. (Ein Ursprung ist eine Domain sowie ein Schema und eine Portnummer .) Standardmäßig sind die Seiten von Site B keinem anderen Ursprung zugänglich . Die Verwendung des Access-Control-Allow-Origin
Headers öffnet eine Tür für den Cross-Origin-Zugriff durch bestimmte anfordernde Ursprünge.
Für jede Ressource / Seite, die Site B Site A zugänglich machen möchte, sollte Site B seine Seiten mit dem Antwortheader versehen:
Access-Control-Allow-Origin: http://siteA.com
Moderne Browser blockieren domänenübergreifende Anfragen nicht direkt. Wenn Site A eine Seite von Site B anfordert, ruft der Browser die angeforderte Seite tatsächlich auf Netzwerkebene ab und prüft, ob in den Antwortheadern Site A als zulässige Anfordererdomäne aufgeführt ist. Wenn Standort B nicht angegeben hat , dass Standort A erlaubt ist , auf dieser Seite zuzugreifen, löst der Browser das XMLHttpRequest
‚s error
Ereignis und verweigert die Antwortdatum an den anfordernden JavaScript - Code.
Nicht einfache Anfragen
Was auf Netzwerkebene passiert, kann etwas komplexer sein als oben erläutert. Wenn es sich bei der Anforderung um eine "nicht einfache" Anforderung handelt , sendet der Browser zuerst eine datenlose "Preflight" -OPTIONS-Anforderung, um zu überprüfen, ob der Server die Anforderung akzeptiert. Eine Anfrage ist nicht einfach, wenn eine (oder beide):
- Verwenden eines anderen HTTP-Verbs als GET oder POST (z. B. PUT, DELETE)
- Verwenden nicht einfacher Anforderungsheader; Die einzigen einfachen Anforderungsheader sind:
Accept
Accept-Language
Content-Language
Content-Type
(dies ist nur einfach , wenn ihr Wert ist application/x-www-form-urlencoded
, multipart/form-data
oder text/plain
)
Wenn der Server auf den OPTIONS-Preflight mit geeigneten Antwortheadern ( Access-Control-Allow-Headers
für nicht einfache Header, Access-Control-Allow-Methods
für nicht einfache Verben) antwortet, die mit dem nicht einfachen Verb und / oder den nicht einfachen Headern übereinstimmen, sendet der Browser die eigentliche Anforderung.
Angenommen, Site A möchte eine PUT-Anfrage senden , für die der Browser /somePage
mit einem nicht einfachen Content-Type
Wert von application/json
zuerst eine Preflight-Anfrage senden würde:
OPTIONS /somePage HTTP/1.1
Origin: http://siteA.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type
Beachten Sie, dass Access-Control-Request-Method
und Access-Control-Request-Headers
vom Browser automatisch hinzugefügt werden. Sie müssen sie nicht hinzufügen. Dieser OPTIONS-Preflight erhält die erfolgreichen Antwortheader:
Access-Control-Allow-Origin: http://siteA.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type
Beim Senden der eigentlichen Anfrage (nach Abschluss des Preflights) ist das Verhalten identisch mit der Behandlung einer einfachen Anfrage. Mit anderen Worten, eine nicht einfache Anfrage, deren Preflight erfolgreich ist, wird genauso behandelt wie eine einfache Anfrage (dh der Server muss immer noch Access-Control-Allow-Origin
erneut senden , um die eigentliche Antwort zu erhalten).
Der Browser sendet die eigentliche Anfrage:
PUT /somePage HTTP/1.1
Origin: http://siteA.com
Content-Type: application/json
{ "myRequestContent": "JSON is so great" }
Und der Server sendet eine zurück Access-Control-Allow-Origin
, genau wie bei einer einfachen Anfrage:
Access-Control-Allow-Origin: http://siteA.com
Siehe Verständnis XMLHttpRequest über CORS für ein wenig mehr Informationen über nicht-einfache Anfragen.
http://siteA/MyCode.js
.