2009-04-15 216 views
4

幫助,如果你能夠 -跨域Ajax請求使用jQuery/PHP

的情況:

http://foobar.com包括遠程託管javacript文件(http://boobar.com/stuff.js)。

的首要目標就是得到遠程託管的PHP腳本提醒。foobar.com

我試圖在stuff.js下面的代碼:

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

沒有運氣。

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

也沒有運氣。

在PHP端我曾嘗試以下兩個:

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

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

在Firefox中,我收到了安全性錯誤。我明白它認爲我違反了安全模式。不過,根據jquery文檔,我應該能夠做到這一點。

+0

所以我落得這樣做,因爲這只是一個GET - 沒有數據需要檢索 - 我用jQuery來創建一個URL,包括我想通過變量隱藏的iframe設置爲源。像魅力一樣工作。給所有提供反饋意見的人 - 謝謝! – lewsid 2009-04-16 13:49:04

回答

8

該錯誤似乎是Same Origin Policy的一項安全功能:爲簡化起見,您只能對源服務器上的東西(http://foobar.com)發出AJAX請求。解決此問題的方法是使原服務器上一個簡單的外觀,如:

<?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); 
?> 

然後,foobar.com,可以使一個AJAX請求http://foobar.com/getstuff.php(這反過來又使一個HTTP GET請求從您的網絡服務器boobar.com並將其發送回瀏覽器)。

對瀏覽器來說,請求會轉到原始服務器,並且被允許(瀏覽器無法知道響應來自場景後面的其他位置)。

注意事項:

  • 在foobar.com的PHP配置必須有allow_url_fopen設置爲 「1」。儘管這是默認設置,但某些服務器已將其禁用。
  • 對www.boobar.com的請求是由foobar.com 服務器製作的,而不是來自瀏覽器。這意味着無論您將什麼cookie或用戶身份驗證數據發送到請求URL(「$possibly_some_other_GET_parameters」),都不會發送到www.boobar.com。
+1

對於最後一步,cookie和身份驗證,也許可以用cURL來完成我猜 – Strae 2009-04-15 16:55:15

+0

我也會用cURL,但是我用`file_get_contents`作爲一個簡單的例子。 – Piskvor 2009-12-01 13:30:25

4

您可以從另一個服務器異步使用腳本標記和JSON獲取數據:

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

你可以使用這個動態加載遠程JavaScript(由創建一個新的腳本元素和設置src屬性,然後加載到DOM中),這可以設置一個變量。但是,您需要真的信任的遠程站點,因爲JS將評估沒有任何先決條件

1

有一種叫做window.name transportwindow.name method的方法,它使用一般的瀏覽器錯誤(不確定這是否是一個錯誤)。您通過iFrame發出請求,並且加載的頁面將您需要的信息放到JavaScript窗口對象的「名稱」屬性中。

此方法使用「blank.htm」,因爲它首先導航到目標頁面,然後返回到blank.htm頁面以克服「同源策略」限制。

道場實施了這個,你可以找到更詳細的解釋here

此外,我已經實現了一個基於此方法的跨域XMLHttpRequest對象,我已經編寫了該庫,可以找到它here

您可能無法使用該庫,因爲它需要一個或兩個額外的庫,可以找到here

如果你需要進一步的幫助來實現你的風格,我會盡我所能。

0

所以我最終做了什麼,因爲它只是一個GET - 沒有數據需要檢索 - 我使用JQuery創建了一個隱藏的iframe,其URL包括我想要傳遞的變量集作爲源。像魅力一樣工作。給所有提供反饋意見的人 - 謝謝!

0

jQuery的阿賈克斯也有設置 '跨域'。

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)