2010-10-19 76 views
7

我很想在CDN a static.mydomain.com上存儲一些.json文件。真相被告知,static.mydomain.com是Amazon S3存儲桶前面的CNAME。有沒有什麼辦法從子域加載json?

我知道這違反了JavaScript安全模型。有沒有建議的解決方法或設計?我已經看到服務器端的東西建議像PHP腳本通過cURL或file_gets_contents()吸取數據,但這是一個非常蹩腳的方法。有沒有辦法從外部服務器加載JSON而不太冒昧?

===

更新:這是想法,導致我相信它是子域名跨域問題的線路。

當我在Chrome中訪問一個頁面(例如static.mydomain.com/json/file.json)時,它會以明文形式顯示。當我訪問Firefox中的頁面時,它試圖讓我保存.json作爲下載。

我在Firebug中看到了一個特殊的結果:A 200響應沒有響應主體。 alt text

我無法通過瀏覽器登錄直接標題;我的Firefox HTTP頭插件在強制下載之前不記錄任何內容。但是在這裏都可以通過這個jQuery SNIPPIT加載時的標題(值得注意的是,該警報低於不火):

jQuery.get("https://static.mydomain.com/json/file.json", 
    function(data){ 
    alert("Data: " + data); 
    } 
); 

響應頭

x-amz-id-2 wSVtjlvFj5ffOtg7ZbKqKw8PexqlzJic7+PxSk975/FcDUnshSV2CiUP2oPWR8yK 
x-amz-request-id 8AD81565A783988D 
Date Tue, 19 Oct 2010 00:07:22 GMT 
Expires Sat, 17 Oct 2015 22:25:37 GMT 
Last-Modified Mon, 18 Oct 2010 01:08:13 GMT 
Etag "2f1c7adcc1a7b0fd8fc8ce1478e0bf81" 
Content-Type application/json 
Content-Length 85966 
Server AmazonS3 

請求頭

Host static.mydomain.com 
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept application/json, text/javascript, */*; q=0.01 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 115 
Connection keep-alive 
Referer http://mydomain.com/directory/referrer.html 
Origin http://mydomain.com 

雖然標題似乎對我來說很好,沒有響應主體要麼獲取,發佈,或我可以扔在這個通過jQuery的任何東西。將內容類型設置爲application/json,text/javascript和text/plain時,我會看到相同的結果。

任何人都可以解釋這種行爲嗎?我想我一定在S3方面做錯了什麼,但是它可能是JavaScript中的跨域問題,還是我可以排除跨域問題?

+0

什麼域名確實是你的應用程序提供服務? – 2010-10-19 02:01:49

+0

我一直認爲子域名可以。真正重要的唯一事情就是whatever.com。你甚至嘗試過嗎? – Gregg 2010-10-19 02:06:27

+0

理想情況下,它將從www.mydomain.com或mydomain.com提供,並且能夠從static.mydomain.com中提取靜態.json數據。 – buley 2010-10-19 02:06:40

回答

4

使用jQuery.getJSON而不是.get。 .get使用XHR,跨域(甚至子域)不友好。 getJSON使用一個可以工作的JSONP請求。

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

你需要修改雖然JSON數據的JSONP響應。它需要一個定義回調的參數。 jQuery創建一個隨機函數作爲回調函數,因此如果您的整個觀點是將其用作CDN,那麼您無法在響應中動態更改回調名稱。

您可以通過將正確的參數傳遞給jQuery來使用靜態回調。AJAX: http://api.jquery.com/jQuery.ajax/

dataType: 'json' //(.getJSON is just a shorthand for .ajax with this paraeter set) 
jsonpCallback: 'myStaticCallbackName' // Lets the client know what callback to expect from the server. 

那麼你的反應應該是這樣的:

myStaticCallbackName({"foo": "bar"}); 
+2

這是JSONP不是JSON不是'是嗎?...基本上你的迴應說使用JSONP而不是JSON。 – themihai 2012-01-15 15:24:31

+0

呃,我猜想,但我不明白它是如何相關的。 JSON和JSONP實際上是兩個不同的東西。 JSON是一種數據格式,JSONP是一種傳輸機制。這就像比較XML與HTTP或蘋果與橙子。 – 2012-01-16 05:33:22

2

您既可以使用JSONP,也可以使用子域的絕對路徑(假設子域在同一臺服務器上,它必須是)。也就是說,你可以使用/ home/path_to_subdomain /等來代替https:blah等等,它應該可以工作。

JSONP也是一個很好的解決方案,但如果你只是提供絕對路徑的子域名,它可能會矯枉過正。

+0

OP希望使用子域,因此文件可以位於S3上,而不是在同一臺服務器上。 Plus「/ home/path_to_subdomain /」是相對路徑,不是絕對路徑。 – 2014-06-20 22:19:55

相關問題