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

Mr_Pouet
quelle
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 .

etwas
quelle
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.

jcarpenter2
quelle
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