CORS-Fehler auf derselben Domain?


86

Ich stoße gerade auf ein seltsames CORS-Problem.

Hier ist die Fehlermeldung:

XMLHttpRequest cannot load http://localhost:8666/routeREST/select?q=[...] 
Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

Zwei Server:

  • localhost: 8666 / routeREST /: Dies ist ein einfacher Python Bottle-Server.
  • localhost: 8080 /: Python simpleHTTPserver, auf dem ich die Javascript-Anwendung ausführe. Diese App führt Ajax-Anforderungen auf dem oben genannten Server aus.

Irgendwelche Gedanken darüber, was das Problem sein könnte?

BEARBEITEN:

Und ... der Hafen war das Problem. Danke für deine Antworten :)

Wenn jemand auch einen Python-Flaschenserver verwendet, können Sie der Antwort in diesem Beitrag folgen, um das CORS-Problem zu lösen: Bottle Py: Aktivieren von CORS für jQuery AJAX-Anforderungen


10
Da sie sich an verschiedenen Ports befinden, sind sie nicht gleich!
— einige

Die Portnummern sind unterschiedlich. Dies könnte gegen Cross Origin-Regeln verstoßen.

4
Beachten Sie, dass der IE die Portnummer nicht berücksichtigt.
— Ray Nicholus

@some Die meisten Browser kommen auch zu dem Schluss, dass sie nicht gleich sind, wenn einer ein 'www' hat und der andere nicht. Der Teufel steckt im Detail.
— Selten 'Wo ist Monica' bedürftig

@SeldomNeedy example.com, www.example.com, www1.example.com und mirror.www.example.com sind unterschiedliche Domänen. example.com , example.com , example.com , example.com:80443 sind alle unterschiedlicher Herkunft.
— einige

Antworten:


122

Es wird nur dann als gleich angesehen, wenn Protokoll , Host und Port identisch sind: Gleiche Ursprungsrichtlinie

Wenn Sie es aktivieren möchten, müssen Sie der Cross-Origin Resource Sharing (cors) folgen, indem Sie Header hinzufügen. Mozilla hat Beispiele

Sie müssen Access-Control-Allow-Origin als Header in Ihre Antwort einfügen. Um es allen zu erlauben (das sollten Sie wahrscheinlich NICHT tun):

Access-Control-Allow-Origin: *

Wenn Sie mehrere Ursprünge unterstützen müssen (z. B. beide example.comund www.example.com), setzen Sie Access-Control-Allow-Originin Ihrer Antwort den Wert des Origin-header aus der Anforderung (nachdem Sie überprüft haben, dass der Ursprung auf der weißen Liste steht).

Beachten Sie auch, dass einige Anfragen eine Preflight-Anfrage mit einer OPTION-Methode senden. Wenn Sie also Ihren eigenen Code schreiben, müssen Sie auch diese Anfragen bearbeiten. Siehe Mozilla für Beispiele .


8
Dies sollte überall dort, wo AJAX involviert ist, mit roter Farbe, Großbuchstaben und Fettdruck hervorgehoben werden .
— Zoltán Schmidt

5
Als Nachtrag zu dieser Antwort, beachten Sie, dass 'Access-Control-Allow-Origin: https://example.com'ist nicht äquivalent 'Access-Control-Allow-Origin: https://www.example.com'. Wenn Ihre Site über beide zugänglich ist, sollten Sie beide in Ihren Antwortheadern haben.
— Selten 'Wo ist Monica' bedürftig

1
Beachten Sie, dass keine Preflight - Anfragen standardmäßig gesendet werden für einfache Anfragen wie GET, POSTund HEAD. Weitere Informationen finden Sie im MDN-Artikel, der in der Antwort verlinkt ist .
— Emile Bergeron

@ SeltenNeedy Sie können keine doppelten Überschriften haben
— Mike Flynn

@ MikeFlynn Mein Wortlaut war zwar etwas locker, aber ich habe nicht versucht, dies vorzuschlagen. Der Server muss lediglich so konfiguriert werden, dass der entsprechende Header gemäß der Anforderung gesendet wird.
— Selten 'Wo ist Monica' bedürftig

30

Die Portnummern sind unterschiedlich.

Eine Anforderung wird als domänenübergreifend betrachtet, wenn Schema, Hostname oder Port nicht übereinstimmen.


1
Außer 443 und 80.
— Joseph Lust

16
einschließlich 443 und 80
— code_monk

5
Wie kann eine Bestätigung des Problems die Lösung des Problems sein? Poste den Antwortkumpel.
— Ritesh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.