2010-10-19 58 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

相关问题