edit 2018-09-13 : Einige Präzisionen zu dieser Anfrage vor dem Flug hinzugefügt und wie sie am Ende dieser Antwort vermieden werden kann.
OPTIONS
Anfragen sind das, was wir pre-flight
Anfragen nennen Cross-origin resource sharing (CORS)
.
Sie sind erforderlich, wenn Sie in bestimmten Situationen Anfragen unterschiedlicher Herkunft stellen.
Diese Anforderung vor dem Flug wird von einigen Browsern aus Sicherheitsgründen gestellt, um sicherzustellen, dass der Server der ausgeführten Anforderung vertraut. Dies bedeutet, dass der Server versteht, dass die Methode, der Ursprung und die Header, die auf die Anforderung gesendet werden, sicher sind.
Ihr Server sollte diese Anforderungen nicht ignorieren, sondern verarbeiten, wenn Sie versuchen, Ursprungsübergreifende Anforderungen auszuführen.
Eine gute Ressource finden Sie hier http://enable-cors.org/
Eine Möglichkeit, dies zu handhaben, besteht darin, sicherzustellen, dass OPTIONS
der Server für jeden Pfad mit Methode eine Antwort mit diesem Header sendet
Access-Control-Allow-Origin: *
Dadurch wird dem Browser mitgeteilt, dass der Server bereit ist, Anfragen von jedem Ursprung zu beantworten.
Weitere Informationen zum Hinzufügen von CORS-Unterstützung zu Ihrem Server finden Sie im folgenden Flussdiagramm
http://www.html5rocks.com/static/images/cors_server_flowchart.png
bearbeiten 2018-09-13
Die CORS- OPTIONS
Anforderung wird nur in einigen Fällen ausgelöst, wie in den MDN-Dokumenten erläutert :
Einige Anfragen lösen keinen CORS-Preflight aus. Diese werden in diesem Artikel als "einfache Anforderungen" bezeichnet, obwohl die Fetch-Spezifikation (die CORS definiert) diesen Begriff nicht verwendet. Eine Anfrage, die keinen CORS-Preflight auslöst - eine sogenannte „einfache Anfrage“ - erfüllt alle folgenden Bedingungen:
Die einzigen zulässigen Methoden sind:
Abgesehen von den vom Benutzeragenten automatisch festgelegten Headern (z. B. Verbindung, Benutzeragent oder einem der anderen Header mit Namen, die in der Abrufspezifikation als „verbotener Headername“ definiert sind), sind dies die einzigen zulässigen Header manuell festgelegt sind diejenigen, die in der Fetch-Spezifikation als "CORS-sicherer Listen-Anforderungsheader" definiert sind:
- Akzeptieren
- Akzeptiere-Sprache
- Inhaltssprache
- Inhaltstyp (beachten Sie jedoch die zusätzlichen Anforderungen unten)
- DPR
- Downlink
- Daten speichern
- Ansichtsfenster-Breite
- Breite
Die einzigen zulässigen Werte für den Content-Type-Header sind:
- application / x-www-form-urlencoded
- mehrteilige / Formulardaten
- Text / Klartext
Für kein in der Anforderung verwendetes XMLHttpRequestUpload-Objekt sind Ereignis-Listener registriert. Auf diese wird mit der Eigenschaft XMLHttpRequest.upload zugegriffen.
In der Anforderung wird kein ReadableStream-Objekt verwendet.
curl
API mache , die funktioniert, aber wenn ich von Chrome aus laufe, bekomme ich den Fehler?Origin
Ihrer Anfrage einen Header hinzufügen , um zu simulieren, als ob die Anfrage von einem bestimmten Host (z. B. yourwebsite.com) stammt. Sie können auch Preflight-Anforderungen simulieren, indem Sie die HTTP-Methode einer Anforderung aufOPTIONS
und dieAccess-Control-*
HeaderIch habe dieses Problem durchgearbeitet. Nachfolgend finden Sie meine Schlussfolgerung zu diesem Problem und meine Lösung.
Gemäß der CORS-Strategie (empfehlen dringend, darüber zu lesen) können Sie den Browser nicht einfach zwingen, das Senden von OPTIONS-Anforderungen zu beenden, wenn er dies für erforderlich hält.
Es gibt zwei Möglichkeiten, wie Sie das umgehen können:
Access-Control-Max-Age
für die OPTIONS - AnforderungEinfache Anfrage
Eine einfache standortübergreifende Anforderung erfüllt alle folgenden Bedingungen:
Die einzigen zulässigen Methoden sind:
Abgesehen von den vom Benutzeragenten automatisch festgelegten Headern (z. B. Verbindung, Benutzeragent usw.) können nur folgende Header manuell festgelegt werden:
Die einzigen zulässigen Werte für den Content-Type-Header sind:
Eine einfache Anfrage führt nicht zu einer OPTIONS-Anfrage vor dem Flug.
Legen Sie einen Cache für die OPTIONS-Prüfung fest
Sie können eine
Access-Control-Max-Age
für die OPTIONS-Anforderung festlegen, damit die Berechtigung erst nach Ablauf erneut überprüft wird.Einschränkung notiert
Access-Control-Max-Age
beträgt600
die maximale Sekunde laut Chrome-Quellcode 10 MinutenAccess-Control-Max-Age
Funktioniert jedes Mal nur für eine Ressource, z. B.GET
Anforderungen mit demselben URL-Pfad, aber unterschiedliche Abfragen werden als unterschiedliche Ressourcen behandelt. Die Anforderung an die zweite Ressource löst also weiterhin eine Preflight-Anforderung aus.quelle
Access-Control-Max-Age
. Das ist der Schlüssel hier. Es hilft Ihnen, übermäßige Preflight-Anfragen zu vermeiden.application/json
nur weil es Ihre Anfrage nicht "einfach" macht (und somit CORS auslöst). Der Browser macht seine Arbeit. Stellen Sie Ihren Server so ein, dass er einen HeaderAccess-Control-Max-Age: 86400
zurückgibt, und der Browser sendet eine OPTIONS-Anfrage 24 Stunden lang nicht erneut.Bitte beziehen Sie sich auf diese Antwort zum tatsächlichen Bedarf an vorgeflogenen OPTIONS-Anfragen: CORS - Was ist die Motivation für die Einführung von Preflight-Anfragen?
Um die OPTIONS-Anforderung zu deaktivieren, müssen die folgenden Bedingungen für eine Ajax-Anforderung erfüllt sein:
application/x-www-form-urlencoded
,multipart/form-data
odertext/plain
Referenz: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
quelle
application/xml
oderapplication/json
sind nicht "Benutzerdefinierte HTTP-Header". Der Header selbst wäreContent-Type
und es wäre irreführend, diesen Header "custom" zu nennen.Wenn Sie die Debug-Konsole geöffnet und die
Disable Cache
Option aktiviert haben, werden Preflight-Anforderungen immer gesendet (dh vor jeder einzelnen Anforderung). Wenn Sie den Cache nicht deaktivieren, wird eine Anfrage vor dem Flug nur einmal gesendet (pro Server).quelle
Ja, es ist möglich, Optionsanfragen zu vermeiden. Die Optionsanforderung ist eine Preflight-Anforderung, wenn Sie Daten an eine andere Domain senden (veröffentlichen). Es ist ein Browser-Sicherheitsproblem. Wir können jedoch eine andere Technologie verwenden: die Iframe-Transportschicht. Ich empfehle Ihnen dringend, jede CORS-Konfiguration zu vergessen und eine vorgefertigte Lösung zu verwenden, die überall funktioniert.
Schauen Sie hier: https://github.com/jpillora/xdomain
Und Arbeitsbeispiel: http://jpillora.com/xdomain/
quelle
Für Entwickler, die den Grund dafür verstehen, aber auf eine API zugreifen müssen, die OPTIONS-Aufrufe ohne Authentifizierung nicht verarbeitet, benötige ich eine vorübergehende Antwort, damit ich lokal entwickeln kann, bis der API-Eigentümer die richtige SPA CORS-Unterstützung hinzufügt oder ich eine Proxy-API erhalte in Betrieb.
Ich habe festgestellt, dass Sie CORS in Safari und Chrome auf einem Mac deaktivieren können.
Deaktivieren Sie dieselbe Ursprungsrichtlinie in Chrome
Chrome: Beenden Sie Chrome, öffnen Sie ein Terminal und fügen Sie diesen Befehl ein:
open /Applications/Google\ Chrome.app --args --disable-web-security --user-data-dir
Safari: Deaktivieren der Richtlinie für denselben Ursprung in Safari
quelle
Wie bereits in früheren Beiträgen erwähnt,
OPTIONS
gibt es Anfragen aus einem bestimmten Grund. Wenn Sie ein Problem mit langen Antwortzeiten von Ihrem Server haben (z. B. eine Verbindung nach Übersee), können Sie die Preflight-Anforderungen auch von Ihrem Browser zwischenspeichern lassen.Lassen Sie Ihren Server mit dem
Access-Control-Max-Age
Header antworten. Bei Anforderungen, die an denselben Endpunkt gesendet werden, wurde die Preflight-Anforderung zwischengespeichert und tritt nicht mehr auf.quelle
OPTIONS
Anfragen mit diesem Header zwischengespeichert werden, ist in der gesamten CORS-Dokumentation, die ich gelesen habe, ziemlich undurchsichtig.Ich habe dieses Problem gerne gelöst.
Es ist nur für die Entwicklung. Damit warte ich 9ms und 500ms und nicht 8s und 500ms. Ich kann das tun, weil sich die JS-Produktions-App auf demselben Computer wie die Produktion befindet, sodass es keine gibt,
OPTIONS
aber die Entwicklung ist meine lokale.quelle
Sie können nicht, aber Sie könnten CORS mit JSONP vermeiden.
quelle
Nachdem ich anderthalb Tage damit verbracht hatte, ein ähnliches Problem zu lösen, stellte ich fest, dass es mit IIS zu tun hatte .
Mein Web-API-Projekt wurde wie folgt eingerichtet:
Ich hatte keine CORS-spezifischen Konfigurationsoptionen im Knoten web.config> system.webServer, wie ich sie in so vielen Beiträgen gesehen habe
Kein CORS-spezifischer Code in der global.asax oder im Controller als Dekorateur
Das Problem waren die Einstellungen des App-Pools .
Der verwaltete Pipeline-Modus wurde auf klassisch ( geändert in integriert ) und die Identität auf Netzwerkdienst ( geändert in ApplicationPoolIdentity ) festgelegt.
Durch Ändern dieser Einstellungen (und Aktualisieren des App-Pools) wurde das Problem für mich behoben.
quelle
Für mich hat es funktioniert, "github.com/gorilla/handlers" zu importieren und dann folgendermaßen zu verwenden:
Sobald ich eine Ajax-POST-Anforderung ausgeführt und JSON-Daten angehängt habe, fügte Chrome immer den Content-Type-Header hinzu, der nicht in meiner vorherigen AllowedHeaders-Konfiguration enthalten war.
quelle
Eine Lösung, die ich in der Vergangenheit verwendet habe: Nehmen wir an, Ihre Website befindet sich auf mydomain.com, und Sie müssen eine Ajax-Anfrage an Foreigndomain.com stellen
Konfigurieren Sie ein IIS-Rewrite von Ihrer Domain in die fremde Domain - z
auf Ihrer mydomain.com-Website - Sie können dann dieselbe Ursprungsanfrage stellen, und es ist keine Optionsanfrage erforderlich :)
quelle
Dies kann bei Verwendung eines Proxys gelöst werden, der die Anforderung abfängt und die entsprechenden Header schreibt. Im speziellen Fall von Lack wären dies die Regeln:
}}
quelle
Möglicherweise gibt es eine Lösung (aber ich habe sie nicht getestet): Sie können CSP (Content Security Policy) verwenden, um Ihre Remotedomäne zu aktivieren, und Browser überspringen möglicherweise die Überprüfung der CORS OPTIONS-Anforderungen.
Wenn ich etwas Zeit finde, werde ich das testen und diesen Beitrag aktualisieren!
CSP: https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Content-Security-Policy
CSP-Spezifikation: https://www.w3.org/TR/CSP/
quelle