2009-04-15 9 views
4

Hilfe, wenn SieCross Domain Ajax-Request mit JQuery/PHP

Die Situation kann-:

http://foobar.com enthält eine remote gehostete Javacript Datei (http://boobar.com/stuff.js).

Ziel ist es, nur auf foobar.com habe

ich den folgenden Code in stuff.js versucht, eine Benachrichtigung von der remote gehostete PHP-Skript zu erhalten:

$.ajax({ 
    type: "GET", 
    url: "http://www.boobar.com/script.php?callback=?", 
    dataType: 'jsonp', 
    success: function(result) { alert(result); } 
}); 

kein Glück.

$.getJSON("http://www.boobar.com/script.php?jsonp=?", 
    function(data) { alert(data); } 
); 

Auch kein Glück.

Auf der PHP-Seite habe ich versucht, die beiden folgenden:

return json_encode(array(0 => 'test')); 

echo json_encode(array(0 => 'test')); 

In Firefox erhalte ich eine Sicherheitsfehler. Ich verstehe, dass es denkt, dass ich das Sicherheitsmodell verletze. Laut der jQuery-Dokumentation sollte dies jedoch möglich sein.

+0

Also, was ich am Ende tun, da es nur ein GET war - keine Daten abgerufen werden müssen - ich verwenden JQuery ein verstecktes iframe mit der URL einschließlich den Variablen erstellen ich zu übergeben wollte Als Quelle festlegen. Lief wie am Schnürchen. An alle, die Feedback gegeben haben - Danke! – lewsid

Antwort

8

Der Fehler scheint ein Sicherheitsmerkmal der Same Origin Policy zu sein: zu vereinfachen, können Sie nur AJAX-Anforderungen für Sachen auf dem Ursprungsserver (http://foobar.com) machen. Ein Weg, um dies ist eine einfache Fassade auf dem ursprünglichen Server zu machen, zB:

<?php 
// this file resides at http://foobar.com/getstuff.php 
echo file_get_contents('http://www.boobar.com/script.php?callback=?' 
      . $possibly_some_other_GET_parameters); 
?> 

Dann von foobar.com, können Sie einen AJAX-Request für http://foobar.com/getstuff.php machen (was wiederum macht eine HTTP-GET-Anfrage aus Ihr Webserver zu boobar.com und sendet es zurück an den Browser).

Zum Browser geht die Anfrage zum Ursprungsserver und ist erlaubt (der Browser kann nicht wissen, dass die Antwort von irgendwo anders hinter der Szene kommt).

Caveats:

  • die PHP-Konfiguration auf foobar.com muss allow_url_fopen auf "1" haben. Obwohl dies die Standardeinstellung ist, wurde sie auf einigen Servern deaktiviert.
  • die Anfrage an www.boobar.com wird von foobar.com Server, nicht aus dem Browser gemacht. Das bedeutet, dass keine Cookies oder Benutzerauthentifizierungsdaten an www.boobar.com gesendet werden, egal was Sie in die Anfrage-URL eingeben ("$possibly_some_other_GET_parameters").
+1

Für den letzten Schritt, die Cookies und Authentifizierung, vielleicht kann es mit cURL ich denke – Strae

+0

Ich würde auch cURL verwenden, aber ich habe 'file_get_contents' als ein einfaches Beispiel verwendet. – Piskvor

4

Sie können Daten von einem anderen Server erhalten asynchron Script-Tags und json mit:

<script type="text/javascript" src="http://somesite.com/path/to/page/"></script> 

Sie diese dynamisch eine Remote Javascript laden zu können (erstellt ein neues Script-Element und das Attribut src Einstellung, dann Laden in das DOM), die eine Variable setzen könnte. Sie müssen jedoch wirklich die Vertrauensstellung der Gegenstelle, weil die JS ohne Vorbedingung ausgewertet wird.

1

Es gibt eine Methode namens window.name transport oder window.name method, die einen allgemeinen Browser-Fehler verwendet (nicht sicher, ob das tatsächlich ein Fehler ist). Sie stellen die Anfrage über einen iFrame und die geladene Seite stellt die Informationen, die Sie benötigen, auf die Eigenschaft "name" des JavaScript-Fensters selbst.

Diese Methode verwendet eine "blank.htm", da sie zuerst zur Zielseite navigiert und dann zur Seite blank.htm zurückkehrt, um die Beschränkung der "gleichen Ursprungsrichtlinie" zu umgehen.

Dojo haben dies implementiert und Sie können eine ausführlichere Erklärung here finden.

Auch ich habe ein domänenübergreifendes XMLHttpRequest-Objekt basierend auf dieser Methode in der Bibliothek, die ich geschrieben habe, die here gefunden werden kann, implementiert.

Sie können die Bibliothek möglicherweise nicht verwenden, da sie 1 oder 2 zusätzliche Bibliotheken benötigt, die Sie finden können here.

Wenn Sie weitere Hilfe bei der Implementierung in Ihrem Stil benötigen, werde ich versuchen, mein Bestes zu geben.

0

Also, was ich getan habe, da es nur ein GET war - keine Daten müssen abgerufen werden - Ich verwendete JQuery, um einen versteckten iframe mit der URL einschließlich der Variablen zu erstellen, die ich als Quelle übergeben wollte. Lief wie am Schnürchen. An alle, die Feedback gegeben haben - Danke!

+0

Wie? Bitte machen Sie Angaben. Vielen Dank. –

+0

Eigentlich habe ich es. Danke für die iframe Idee. –

0

jQuery .ajax hat auch eine Einstellung 'domänenübergreifende'.

http://api.jquery.com/jQuery.ajax/

 
crossDomain (default: false for same-domain requests, true for cross-domain requests) 
Type: Boolean 
If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. (version added: 1.5)