Ich erstelle eine REST-Anwendung, die CORS verwendet. Jeder REST-Aufruf ist anders und ich stelle fest, dass das Abrufen des Preflight-OPTIONS-Aufrufs einen erheblichen Aufwand bedeutet. Gibt es eine Möglichkeit, ein Preflight-OPTIONS-Ergebnis zwischenzuspeichern und anzuwenden, sodass nachfolgende Aufrufe derselben Domäne die zwischengespeicherte Antwort verwenden?
78
Antworten:
Preflight kann nur auf die Anforderung angewendet werden, nicht auf die gesamte Domain. Ich habe dieselbe Frage auf die Mailingliste gesetzt, und es gab Sicherheitsbedenken. Hier ist der gesamte Thread: http://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html
Es gibt einige Dinge zu beachten, wenn Sie die Anzahl der Preflight-Anfragen begrenzen möchten. Beachten Sie zunächst, dass WebKit / Blink-basierte Browser einen maximalen Preflight-Cache von 10 Minuten festlegen:
https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpp https://chromium.googlesource.com/chromium/blink/+/master/Source/core/loader/CrossOriginPreflightR .cpp
(Ich bin nicht sicher, ob dies für andere Browser gilt). Während Sie also immer den Header Access-Control-Max-Age festlegen sollten, beträgt der Maximalwert 10 Minuten.
Nächster Hinweis: Es ist unmöglich, einen Preflight bei PUT / DELETE-Anforderungen zu vermeiden. Für Aktualisierungen / Löschungen Ihrer API ist daher mindestens alle 10 Minuten ein Preflight erforderlich.
Vermeiden Sie bei GET / POST nach Möglichkeit benutzerdefinierte Header, da diese weiterhin Preflights auslösen. Wenn Ihre API JSON zurückgibt, beachten Sie, dass ein Inhaltstyp von 'application / json' auch einen Preflight auslöst.
Wenn Sie bereit sind, zu verbiegen, wie "RESTful" Ihre API ist, können Sie noch einige weitere Dinge ausprobieren. Eine Möglichkeit besteht darin, einen Inhaltstyp zu verwenden, für den kein Preflight erforderlich ist, z. B. "Text / Plain". Benutzerdefinierte Header lösen immer Preflights aus. Wenn Sie also benutzerdefinierte Header haben, können Sie diese in Abfrageparameter verschieben. Am äußersten Ende könnten Sie ein Protokoll wie JSON-RPC verwenden, bei dem alle Anforderungen an einen einzelnen Endpunkt gestellt werden.
Ehrlich gesagt ist der Preflight-Cache aufgrund des Preflight-Cache-Limits des Browsers von 10 Minuten und der REST-Ressourcen-URLs ziemlich nutzlos. Es gibt sehr wenig, was Sie tun können, um Preflights im Verlauf einer lang laufenden App einzuschränken. Ich bin zuversichtlich, dass die Autoren der CORS-Spezifikation versuchen werden, dies in Zukunft zu beheben.
quelle
Access-Control-Max-Age
ist vorhanden und genau dieselbe URL wurde von gesehen Der Browser zuvor und innerhalb des vonAccess-Control-Max-Age
und angegebenen Bereichs verkürzt den Wert nicht (Webkit, Firefox). Wenn Sie die benutzerdefinierten Header entfernen und in die URL verschieben, sendet der Browser die OPTIONS-Anforderung nicht. Sieg!Versuchen Sie es mit xDomain
Es war ziemlich einfach für mich einzurichten, wenn ich Angular oder jQuery verwendete. Fügen Sie auf Ihrem App-Server eine proxy.html hinzu, wie in der Hilfe unter dem folgenden Link angegeben. Fügen Sie einige Tags hinzu, die auf die js-Dateien auf Ihrem "Client" und Ihrer Bratsche verweisen, keine Vorflüge mehr. Dies wird in einen Iframe eingeschlossen, um die Notwendigkeit einer Cors-Überprüfung zu vermeiden.
https://github.com/jpillora/xdomain
quelle
Eine Möglichkeit besteht darin, dass Sie alle Ihre API-Aufrufe auf dieselbe Domäne wie Ihr Front-End verweisen können. Richten Sie nginx auf dem Front-End-Server so ein, dass nur API-Aufrufe an den API-Server weitergeleitet werden. Dadurch werden alle Anrufe vor dem Flug entfernt.
quelle