2010-10-19 12 views
7

Me encantaría esconder algunos archivos .json en un CDN a la static.mydomain.com. A decir verdad, static.mydomain.com es un CNAME frente a un cubo de Amazon S3.¿Hay alguna forma de cargar json desde un subdominio?

Entiendo que esto infringe el modelo de seguridad de JavaScript. ¿Hay una solución o diseño recomendado? He visto cosas del lado del servidor sugeridas como un script PHP para absorber datos a través de cURL o file_gets_contents(), pero ese es un enfoque bastante poco convincente. ¿Hay alguna forma de cargar JSON desde un servidor extranjero sin ser demasiado hacky?

===

ACTUALIZACIÓN: Aquí está la línea de pensamiento que me llevó a creer que es un problema crossdomain para los subdominios.

Cuando visito una página (por ejemplo, static.mydomain.com/json/file.json) en Chrome, se muestra como si fuera texto sin formato. Cuando visito la página en Firefox, intenta hacer que guarde el .json como descarga.

Veo un resultado peculiar en Firebug: A 200 respuesta sin cuerpo de respuesta. alt text

No puedo registrar los encabezados directos a través del navegador; mi complemento de encabezado HTTP de Firefox no registra nada antes de que se fuerce la descarga. Sin embargo aquí están las cabeceras cuando se carga a través de este snippit jQuery (vale la pena destacar, por debajo de la alerta no se dispara):

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

Encabezados de respuesta

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 

Solicitar encabezados

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 

Aunque los encabezados me parecen estar bien, no hay cuerpo de respuesta ya sea para obtener, publicar o cualquier otra cosa que pueda arrojar a través de jQuery. Veo el mismo resultado al configurar el tipo de contenido en application/json, text/javascript y text/plain.

¿Alguien puede explicar este comportamiento? Me imagino que debo estar haciendo algo mal en el lado S3, pero ¿podrían ser problemas de dominio cruzado en JavaScript o puedo descartar problemas de subdominio cruzado?

+0

Lo que hace de dominio es su aplicación sirve de? –

+0

Siempre pensé que los subdominios estaban bien. Lo único que realmente importa es whatever.com. ¿Lo has intentado? – Gregg

+0

Lo ideal es que se publique desde www.midominio.com o midominio.com, y sea capaz de extraer datos estáticos .json de static.midominio.com. – buley

Respuesta

4

Use jQuery.getJSON en lugar de .get. .get usa un XHR, que no es amigable en todos los dominios (incluso en los subdominios). getJSON usa una solicitud JSONP que funcionará.

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

Tendrá que modificar los datos JSON para una respuesta JSONP sin embargo. Toma un parámetro que define una devolución de llamada. jQuery crea una función aleatoria para servir como devolución de llamada, por lo que si su objetivo es utilizar esto como CDN, no podrá cambiar dinámicamente el nombre de devolución de llamada en la respuesta.

Puede utilizar una devolución de llamada estática pasando los parámetros correctos a 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. 

Luego, su respuesta debe ser similar:

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

¿Eso es JSONP no JSON isnt 'is? ... básicamente su respuesta dice que use JSONP en lugar de JSON. – themihai

+0

Erm, creo que más o menos, pero no veo cómo es relevante. JSON y JSONP son efectivamente dos cosas diferentes. JSON es un formato de datos y JSONP es un mecanismo de transferencia. Sería como comparar XML contra HTTP o manzanas contra naranjas. –

2

Puede usar JSONP o utilizar una ruta de acceso absoluta al subdominio (esto supone que el subdominio está en el mismo servidor, que debe ser). Es decir, en lugar de https: blah blah, usarías/home/path_to_subdomain/etc. y debería funcionar.

JSONP es una buena solución también, pero puede ser exagerado si puede proporcionar una ruta de acceso absoluta del subdominio.

+0

El OP quiere usar un subdominio para que los archivos puedan sentarse en S3, no en el mismo servidor. Además "/ home/path_to_subdomain /" es una ruta relativa, no una ruta absoluta. –

Cuestiones relacionadas