Wir haben einen API-Endpunkt, der zu einem anderen Server umleitet. Es wird über XHR aufgerufen und scheint in den meisten Browsern gut zu funktionieren, außer für Safari (speziell für iOS).
Der Fehler, den ich in der Konsole erhalte, ist: Cross-Origin-Umleitung, die von der Cross-Origin Resource Sharing-Richtlinie abgelehnt wird
Wir haben CORS auf der Seite, die die Umleitung durchführt und auf dem anderen Server. Die Umleitungsseite legt fest:
%Vor%Der andere Server hat:
%Vor%Wie kann ich die Umleitung in der CORS-Richtlinie zulassen?
Die W3C-Spezifikation und andere autorisierende Quellen verbieten Wildcard Access-Control-Allow-Origin
direkt, wenn sie mit Access-Control-Allow-Credentials: true
verwendet werden.
Hinweis: Die Zeichenfolge "*" kann nicht für eine Ressource verwendet werden, die Anmeldeinformationen unterstützt.
Wichtiger Hinweis: Wenn der Server auf eine Anmeldungsanforderung antwortet, muss er eine Domäne angeben und keine Platzhalter verwenden.
Wenn der Anmeldeinformationsmodus "include" ist, kann
Access-Control-Allow-Origin
nicht*
sein.
Da Ihre Frage keine Details enthält, lassen Sie uns einige Definitionen machen:
Zunächst denke ich, dass Sie einen Workaround machen wollen. Solange Sie gesagt haben, dass alle Endpunkte unter Ihrer Kontrolle sind, haben Sie entweder:
Es ist auch wichtig, einen Fehler im WebKit-Tracker zu melden, wenn er wirklich gegen die Spezifikation verstößt. Um den Fall zu reproduzieren, habe ich eine CherryPy-App erstellt, die Sie an den Bericht anhängen können. Der Schritt, um es auszuführen:
/etc/hosts
hinzu.
corsredirect.py
ein
Führen Sie diese Befehle im Terminal
aus %Vor%Zeigen Sie mit Ihrem Browser auf Ссылка und drücken Sie die Taste
Da ist die App.
%Vor%Sie müssen den "Access-Control-Allow-Methods" Header setzen.
%Vor%Ich stieß auf ein ähnliches Problem beim Hosten meiner API in einer Heroku-App. In Chrome und Firefox funktionierten Anfragen an meine API aus einer anderen Domain einwandfrei, aber in Safari wurde mir eine frustrierende "Cross-Origin-Umleitung verweigert von Cross-Origin Resource Sharing Policy".
Nach einigen Nachforschungen scheint es einen Bug zu geben in Safari, die einige Weiterleitungen mit CORS verhindert. Ich konnte das umgehen, indem ich die Heroku-App direkt anforderte ( myapp.herokuapp.com/api
) anstatt an meine Domain ( mydomain.com/api
).
Wenn Sie ein Setup eingerichtet haben, bei dem Weiterleitungen zu Ihrer API vorhanden sind, kann die direkte Anforderung der Stammdomäne hilfreich sein.
Wenn Sie Ihre URL ändern können, können Sie es mit einer Proxy-Pass-Konfiguration auf Ihrem Apache versuchen. Der Anruf sieht so aus, als wäre er auf derselben Domain, aber das wird nicht funktionieren. Ссылка
Für alles andere als eine "einfache Anfrage" verweigern die autorisierenden Quellen Platzhalter für den Header "Access-Control-Allow-Origin" und verlangen, dass Sie den Header "Access-Control-Allow-Header" explizit setzen.
Was Mozilla für "Einfache Anfrage" festlegt :
Die einzigen zulässigen Methoden sind:
- GET
- KOPF
- POST
Abgesehen von den Kopfzeilen, die automatisch vom Benutzeragenten (z.B. Verbindung, User-Agent, etc.), die einzigen Header, die erlaubt sind manuell eingestellt werden:
- Akzeptiere
- Accept-Sprache
- Content-Sprache
- Inhaltstyp
Die einzigen zulässigen Werte für den Content-Type-Header sind:
- Anwendung / x-www-form-urlencoded
- multipart / form-data li>
- text / plain
Wenn Ihre Anfrage die Anforderungen der "einfachen Anfrage" nicht erfüllt, fallen Sie wahrscheinlich in "Preflighted Requests" .
andere Methoden als GET, HEAD oder POST. Wenn POST verwendet wird, um Anforderungsdaten mit einem anderen Inhaltstyp als Anwendung / x-www-form-urlencoded, multipart / form-data oder text / plain, z. Wenn die POST-Anfrage mithilfe von application / xml oder text / xml eine XML-Payload an den Server sendet, wird die Anfrage mit Preflight versehen.
Wie für Anmeldeinformationen -
Wichtiger Hinweis: Wenn der Server auf eine Anmeldungsanforderung antwortet, muss er eine Domäne angeben und keine Platzhalter verwenden. Zugriffssteuerung-Erlauben-Ursprung: *
Da Sie die tatsächlichen HTTP-Anfragen und Antworten von Ihrer Seite und Ihren Servern nicht angegeben haben, muss ich einige Annahmen machen. Ich gehe davon aus, dass Ihre Seite unter der Domain foo.example geladen ist und dass sich Ihre API unter der gleichen Domain foo.example befindet und dass sich Ihr "anderer" Server in der Domain bar.example befindet.
Sie müssen Ihre Seite wahrscheinlich so einrichten, dass sie mit diesen Kopfzeilen eine Weiterleitungsanforderung an den "anderen" Server sendet:
%Vor%Sie müssen dann wahrscheinlich Ihren "anderen" Server so einrichten, dass er auf eine Options-Anfrage antwortet mit:
%Vor%Dann sollte Ihre Seite die Anfrage abschließen können.