2013-03-22 48 views
5

我有兩個文件,domain.com/test2.php:爲什麼不設置document.domain工作以允許AJAX請求到父域?

<div id="testDiv"></div> 

<script src="http://domain.com/packages/jquery.js"></script> 
<script>$("#testDiv").load("http://domain.com/test3.php", {var1:1, var2:2});</script> 

和domain.com/test3.php:

<b>var1: <?php echo $var1; ?> , var2: <?php echo $var2; ?></b> 

在這種情況下domain.com/test2.php輸出 var1: 1 , var2: 2正如人們所期望的那樣,但現在讓我們說我想在子域中創建一個test2.php。要停止與跨域腳本的問題,我想這額外的行添加到sub.domain.com/test2.php開始:

<script>document.domain = "domain.com";</script> 

這額外的行停止從顯示出來的跨域錯誤,但現在該文件不再輸出var1: 1 , var2: 2。爲什麼是這個,我該如何解決這個問題?

+1

你能看到的請求,你的子域在網絡日誌中的開發工具中顯示嗎?它看起來是否成功並返回了您預期的響應? – 2013-03-28 05:59:11

+0

@MartinAtkins請求以紅色顯示,狀態爲「(已取消)」。 – 2013-03-28 17:56:25

回答

10

document.domain機制的目的是用於允許幀之間的客戶端通信,而不是客戶機到服務器的通信。如果從example.com包含一個網頁一個框架,並從foo.example.com包含頁面另一個框架則二者不能互相訪問對方的DOM,除非後者套document.domainexample.com,你在你的例子顯示。

跨域AJAX請求現代化的優選機制是Cross-Origin Resource Sharing,或「CORS」。這種機制涉及讓目標資源返回一個特殊的HTTP響應頭,表明允許跨域請求。在你的情況下,你會做你的test3.php返回以下HTTP響應頭:

Access-Control-Allow-Origin: sub.domain.com 

在PHP中,你可以這樣做如下:

header("Access-Control-Allow-Origin: sub.domain.com"); 

還可以將此標頭值設置爲只*爲了允許來自的任何來源的跨域請求,但請注意,這將允許來自您不受控制的網站的請求。從客戶端

請求JavaScript庫通常還包括附加的報頭X-Requested-With不在由CORS允許的標準集,所以它可能有必要明確地允許該頭經由附加響應頭:

Access-Control-Allow-Headers: X-Requested-With 

CORS僅在現代瀏覽器中受支持。對於較老的瀏覽器,通用慣例是使用JSON-P,這是利用一個服務器上的頁面能夠從另一個服務器加載和執行腳本文件的技巧。這種技術要求目標資源是一個在頁面中調用函數的有效JavaScript程序,因此它不像CORS那樣優雅和無縫,但它應該可以在任何支持JavaScript的瀏覽器中使用。

+0

是的。設置爲*表示任何域都可以從中加載數據。 – 2013-03-28 18:28:39

+0

哦,是的......我把這個添加到我的答案中。謝謝。 – 2013-03-28 18:45:56

+0

當我嘗試這個時,我得到一個500內部服務器錯誤: '內部服務器錯誤 服務器遇到內部錯誤或配置錯誤,無法完成您的請求。 此外,嘗試使用ErrorDocument來處理請求時遇到404未找到錯誤。「 – 2013-03-28 18:48:18