Cross-Origin-Umleitung, die von der Richtlinie "Cross-Origin Resource Sharing" in Safari abgelehnt wurde

8

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?

    
Noodles 21.11.2016, 01:14
quelle

7 Antworten

6

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.

Ссылка

Weitere Schritte

Da Ihre Frage keine Details enthält, lassen Sie uns einige Definitionen machen:

  • domain-a ist die Domäne Ihres Client-Codes
  • domain-b ist die Domäne des Endpunkts, an den Ihre Anforderung an
  • gerichtet ist
  • domain-c ist die Domäne, in der die Anforderung schließlich an
  • weitergeleitet wird

Zunächst denke ich, dass Sie einen Workaround machen wollen. Solange Sie gesagt haben, dass alle Endpunkte unter Ihrer Kontrolle sind, haben Sie entweder:

  • Stellen Sie eine direkte Anfrage von domain-a an domain-c (oder machen Sie eine bedingte Anfrage, wenn die Umleitung von einem Parameter abhängt)
  • Zeigen Sie einen anderen Endpunkt in Ihrem Back-End an, der die Anforderung an domain-b umschließt

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:

  1. Fügen Sie "127.0.0.1 domain-a domain-b domain-c" zu Ihrem /etc/hosts hinzu.
  2. Fügen Sie den folgenden Code in corsredirect.py ein
  3. Führen Sie diese Befehle im Terminal

    aus %Vor%
  4. Zeigen Sie mit Ihrem Browser auf Ссылка und drücken Sie die Taste

Da ist die App.

%Vor%     
saaj 29.11.2016 16:43
quelle
1

Sie müssen den "Access-Control-Allow-Methods" Header setzen.

%Vor%     
user3674603 27.11.2016 20:38
quelle
1

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.

    
Rafi 29.11.2016 13:29
quelle
1

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. Ссылка

    
Michael Lane 29.11.2016 16:38
quelle
1

Hast du es versucht?

Access-Control-Allow-Origin: * Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept" Access-Control-Allow-Methods: * Weitere Informationen finden Sie Ссылка

    
Nur Rony 29.11.2016 16:41
quelle
0

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   
  • 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.

    
Don Colorado 30.11.2016 01:01
quelle
0

Das Aktivieren von HTTPS auf beiden Servern hat das Problem für mich gelöst.

    
gray75c 05.12.2016 10:05
quelle

Tags und Links