lokaler AJAX-Aufruf an die Gegenstelle funktioniert in Safari, aber nicht in anderen Browsern

8

Ich pflege eine Website, die Javascript verwendet. Das Skript verwendet jQuery und lädt einige Inhalte von dem Server, auf dem die Site normalerweise gehostet wird.

Aus Gründen der Einfachheit bei der Pflege der Site leite ich eine lokale Kopie der Site auf meinem iMac. Das funktioniert ganz gut, wenn ich Safari benutze. Aber Firefox, Opera und Chrome weigern sich zu arbeiten. Ich denke, es liegt an der Cross-Domain-Politik. (Ich konnte dies nicht mit dem IE testen, da IE in einer virtuellen Maschine auf meinem iMac laufen muss, daher ist es nicht möglich, auf lokale Dateien zuzugreifen)

Gibt es eine Einstellung in Firefox und den anderen Browsern, wo ich dem Browser sagen kann, dass es in Ordnung ist, Dateien zu laden, die sich auf einem entfernten Server von einer lokalen HTML-Seite mit einem lokalen Javascript befinden?

Kurz gesagt: Das ist meine html-Seite:

%Vor%

Dies ist myScript.js:

%Vor%

Es gibt auch einen Event-Listener, der auf Blättern und Größenänderungen lauscht und einige andere Bedingungen überprüft (zB: ist bereits ein Ajax-Aufruf in Bearbeitung?). Dieser Listener ruft StartAJAX auf.

Wenn ich StartAJAX auf einer lokalen Kopie meiner Seite (file: /// User / ...) in Safari anrufe, bekomme ich den Ajax-Inhalt perfekt in mein HTML-Dokument eingefügt. In den anderen Browsern bekomme ich die Fehlermeldung in die HTML-Seite eingefügt. Es ist:

  

JSON-Antwort: undefined
  JSON-Fehlerstatus: Fehler
  Fehler:

Warum funktioniert es in Safari, aber nicht in Firefox, Chrome und Opera?

Wie kann ich diese Browser zum Laufen bringen?

(Ich muss es mit allen Browsern testen, da alle Browser dasselbe html-Domament unterschiedlich darstellen, aber ich möchte nicht alle Dateien nach jeder Änderung auf den Server hochladen, nur um es zu testen.)

BEARBEITEN:

Nachdem ich einige Antworten gelesen habe, möchte ich etwas klarstellen, das ich offensichtlich nicht klar genug gemacht habe:

Ich suche nach Einstellungen in Webbrowsern

  1. Ich werde die Einstellungen meines Remote-Webservers (Apache) NICHT ändern
  2. Ich werde keine Dateien auf meinem Remote-Rechner (.htaccess)
  3. manipulieren
  4. Ich werde keinen Webserver auf meinem lokalen iMac einrichten
  5. Ich werde den Code der AJAX-Aufrufe in meinen Javascript-Dateien NICHT ändern
  6. Ich werde den Code der Perl-Skripte auf meinem entfernten Server NICHT ändern

Ich kann dir sagen warum:

Ich mache nur eine kurze Wartung, und ich bin zu faul, um jede manipulierte Datei auf den entfernten Rechner hochzuladen, nachdem ich sie bearbeitet habe. Die Einstellungen des Webservers sind für den tatsächlichen Betrieb in Ordnung. Ich möchte sie nicht ändern (und vielleicht die Änderungen vergessen, bevor ich meine Arbeit beende). Das Gleiche gilt für die Skripte: Die Teile, die einige von euch ändern wollen, funktionieren genauso gut wie sie jetzt sind. Es gibt keinen Grund, die Ajax-Calls zu berühren, weil in der produktiven Umgebung nichts falsch mit ihnen ist.

Ich will nur, dass diese blöden Browser Firefox, Opera und Chrome sich wie Safari verhalten und die Ajax-Anrufe korrekt abarbeiten.

BTW:

Kann irgendjemand erklären, was so riskant ist, Daten über Ajax von einer anderen Domain in Firefox, Opera oder Chrome aus aufzurufen, obwohl es harmlos zu sein scheint, wenn man dasselbe in Safari tut?

    
Hubert Schölnast 29.04.2015, 15:02
quelle

4 Antworten

4

CHROME

Es gibt ein Plugin für Chrome , das erzwungen wird um die Sicherheitsrichtlinie zu ignorieren. Sie können dies auch mit Flaggen tun. Hinweis: Bitte durchsuchen Sie nicht das "echte Web" mit dieser Option, da dies ein Sicherheitsrisiko für Ihren Computer darstellt.

FIREFOX

Dieser Thread zeigt an, dass derzeit keine Möglichkeit besteht, dies zu tun das in Firefox.

OPERA

Auch hier scheint es keine eingebaute Möglichkeit zu geben, CORS-Richtlinien zu ignorieren.

Die Alternative wäre, dass der Server ( Ссылка ) in Ihrem Fall die richtigen Header zurückgibt - speziell Access-Control-Allow-Origin:

    
Rob 01.05.2015, 17:24
quelle
3

Um diese Probleme zu vermeiden, sollten Sie Ihre Seite (auf Ihrem lokalen Computer ist es in Ordnung) mit einem Webserver (wie Apache, Nginx, ...) entwickeln, so dass Ihre URL Ajax Anrufe mit dem Protokoll http oder https, nicht startet "Datei". "Datei" ist der Pfad Ihrer Datei, jedoch unter Verwendung des SO-Pfadsystems, nicht eines Webserver-Systems.

Auf der anderen Seite hat Browser "Same Origin Policy". Dies ist eine Sicherheitsfunktion, aber was sind die "Probleme" in der Web-Entwicklung mit Ajax-Aufrufe? Nun, Ihre Ajax-Anrufe werden immer an denselben Server gesendet, wenn Sie beispielsweise Ihr Web in der Domain " Ссылка " haben, dann ruft Ihr Ajax an muss zu derselben Domain gehören " Ссылка ".

Um SOP in Ajax-Aufrufen "zu umgehen", haben Sie drei Lösungen:

  • Erstellen Sie auf Ihrer "my-domain.com" einen Proxy, der curl (zB in php) verwendet, um die Daten abzurufen und an Ihren Ajax-Anruf zurückzugeben
  • Verwenden Sie JSON-P
  • Erlauben Sie Ihrer Domain auf Ihrem Webserver (zB .htaccess) eine korrekte Konfiguration für CORS: Ссылка

BTW

Ich werde antworten: " Bitte kann jemand erklären, was so riskant ist, um Daten über Ajax von einer anderen Domain aus aufzurufen ". (Kopieren & Einfügen von mozilla MDN Ссылка )

  

Die Richtlinie für denselben Ursprung beschränkt die Art des Ladens eines Dokuments oder Skripts   Ein Ursprung kann mit einer Ressource von einem anderen Ursprung interagieren.   Gleichen Ursprungsrichtlinie wird als ein Mittel verwendet, um einige der zu verhindern   Cross-Site Request Forgery Angriffe.

    
Jose Mato 01.05.2015 20:58
quelle
1

Aufgrund der gleichen Ursprungsrichtlinie können Sie normalerweise keine Ressourcen von einer anderen Domäne anfordern. Versuchen Sie, crossDomain: true zu Ihrer AJAX-Anfrage hinzuzufügen, da Sie versuchen, eine Anfrage an eine andere Domäne zu stellen.

%Vor%     
Michael Hamilton 03.05.2015 13:20
quelle
0

Wenn Sie davon ausgehen, dass es sich bei der Website um Domäne A und das Perl-Skript um Domäne B handelt, haben Sie zwei Möglichkeiten: 1) Aktivieren Sie CORS auf dem Webserver unter Domäne B. Ссылка 2) Erstellen Sie ein Skript (php, perl, aschex usw.) für Domäne A, die das Skript für Domäne B aufruft. Das Skript für Domäne A fungiert als Proxy und wird von allen Webbrowsern zugelassen.

    
itsben 07.05.2015 13:15
quelle