2 Stimmen

Quer-Website-AJAX mit Proxy funktioniert nicht.

Ich versuche, Cross-Site-Ajax mit Tinyproxy als Reverse-Proxy zu verwenden. Hier ist die Konfiguration:

  • Ein Desktop-System mit Gentoo Linux. Die IP-Adresse lautet x.x.x.x. Boa (Webserver, Port 80) und Tinyproxy (HTTP-Proxy, Port 8888) laufen auf diesem System.

Hier sind die Testdateien:

\======= a.html ======

    Ajax-Test

\======= a.js ========

$(document).ready( function() {

    function error_func()
    {
        alert("Fehler aufgetreten");
    }

    function ajax_func(data)
    {
        alert("Ajax erhalten");
    }

    $.get("http://x.x.x.x:8888/outside/xyz.txt", ajax_func).error(error_func);

});

Ich habe Tinyproxy so konfiguriert, dass http://x.x.x.x:8888/outside/ auf http://www.outside.com/ umgeleitet wird. Ich kontrolliere diese Domain und habe dort eine Textdatei mit dem Inhalt "Teststring" platziert, namens xyz.txt.

Wenn ich die folgende URL in Firefox eingebe: x.x.x.x:8888/xyz.txt, funktioniert alles und ich sehe den "Teststring" im Browserfenster angezeigt. Aber wenn ich x.x.x.x/a.html in Firefox eingebe, erhalte ich den Dialog "Fehler aufgetreten". Ich habe das in IE, Safari, Firefox und Chrome ausprobiert und erhalte den "Fehler aufgetreten"-Dialog in allen davon.

Bitte beachten Sie, dass mir das "Same Origin Policy" bekannt ist, deshalb verwende ich Tinyproxy, um diese Einschränkung zu umgehen.

Ich habe Wireshark auf dem Gentoo Linux-System verwendet, um den Verkehr zu überwachen. Alles sieht in Ordnung aus. Ich sehe eine HTTP-Transaktion zwischen Firefox und x.x.x.x, dann sehe ich eine HTTP-Transaktion zwischen x.x.x.x und "outside" und schließlich eine weitere HTTP-Transaktion zwischen x.x.x.x und Firefox. Die HTTP 200 OK enthält den "Teststring" wie erwartet. Aber trotzdem ist jQuery nicht zufrieden und ich erhalte nicht den "Ajax erhalten"-Dialog...

Eine Sache, die ich vermute, ist der HTTP-Header "Server". Das System x.x.x.x gibt "Server: Boa" an, aber die endgültige Antwort hat "Server: Apache". Würde ich aufgrund dieses Unterschieds gegen die Same-Origin-Policy verstoßen?

1voto

iMoses Punkte 4298

Ajax-Kommunikationen müssen unter diesen drei Bedingungen erfolgen:

  1. Gleicher Host
  2. Gleiche Protokoll
  3. Gleicher Port

Technisch gesehen kann man also keinen Ajax-Aufruf machen, wenn man zwischen verschiedenen Ports kommuniziert. ABER es gibt eine einfache Lösung. Du kannst die oben genannten Bedingungen ignorieren, wenn du einen Access-Control-Allow-Origin-Header definierst, der es dir ermöglicht, Zugriff von einem anderen Host/Protokoll/Port zu erhalten.

Es ist wichtig sicherzustellen, dass deine Webseite über die richtigen Header(s) Zugriff auf deinen Proxy erhält.

Weitere Informationen findest du hier: https://developer.mozilla.org/en-US/docs/HTTP_access_control

0voto

Roman Punkte 5560

Die same-origin policy beschränkt den Zugriff auf:

  • gleichen Host
  • gleiches Protokoll
  • gleichen Port

Die same-origin policy gilt auch für deinen Fall, weil du versuchst, auf x.x.x.x:8888 von x.x.x.x:80 zuzugreifen.

Du musst den Inhalt auch über den gleichen Port bereitstellen.

0voto

Alex Dn Punkte 5335

Vor ungefähr einem Monat habe ich fast dieselbe Frage gestellt. Die Antwort finden Sie hier: Cross-Protokoll Cookie iFrame

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X