2010-10-19 7 views
7

Chciałbym przechować niektóre pliki .json na CDN a la static.mydomain.com. Prawda jest taka, static.mydomain.com jest rekordem CNAME znajdującym się przed wiadrem Amazon S3.Czy istnieje sposób na załadowanie json z subdomeny?

Rozumiem, że narusza to model zabezpieczeń JavaScript. Czy istnieje zalecane rozwiązanie lub projekt? Widziałem rzeczy po stronie serwera sugerowane jak skrypt PHP do pobierania danych przez cURL lub file_gets_contents(), ale to dość kiepskie podejście. Czy istnieje sposób, aby załadować JSON z obcego serwera bez zbytniej zemsty?

===

UPDATE: Oto sposób myślenia, który doprowadził mnie do przypuszczenia, że ​​jest to problem dla crossdomain subdomen.

Gdy odwiedzam stronę (np. Static.mydomain.com/json/file.json) w przeglądarce Chrome, wyświetla się ona w postaci tekstu jawnego. Kiedy odwiedzam stronę w Firefoksie, próbuje mnie zmusić do zapisania pliku .json do pobrania.

Widzę dziwny wynik w Firebug: A 200 odpowiedź bez treści odpowiedzi. alt text

Nie mogę rejestrować bezpośrednich nagłówków przez przeglądarkę; moja wtyczka nagłówka HTTP Firefoksa nie rejestruje niczego, zanim nie zostanie wymuszona. Jednak tutaj są nagłówki gdy ładowane za pomocą tego jQuery snippit (warto zauważyć, alert poniżej nie ogień):

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

nagłówki odpowiedzi

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 

Żądanie Główki

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 

Choć nagłówki wydają mi się w porządku, nie ma ciała odpowiedzi ani na get, post, ani na cokolwiek innego, co mogę wyrzucić w tym przez jQuery. Widzę ten sam wynik przy ustawianiu typu zawartości na application/json, text/javascript i text/plain.

Czy ktoś może wyjaśnić to zachowanie? Sądzę, że muszę zrobić coś złego na stronie S3, ale czy może to być problem z wieloma domenami w JavaScript lub czy mogę wykluczyć problemy z poddomią?

+0

Co domenie robi to aplikacja podawane? –

+0

Zawsze uważałem, że poddomeny były w porządku. Jedyne, co naprawdę ma znaczenie, to whatever.com. Czy próbowałeś tego? – Gregg

+0

Najlepiej byłoby, gdyby był on obsługiwany przez witrynę www.mydomain.com lub mydomain.com, a także byłby w stanie pobrać statyczne dane .json ze static.mydomain.com. – buley

Odpowiedz

4

Użyj jQuery.getJSON zamiast .get. .get używa XHR, który nie jest przyjazny dla domen (nawet subdomen). getJSON używa żądania JSONP, które zadziała.

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

Musisz zmodyfikować dane JSON na odpowiedź JSONP chociaż. Przyjmuje parametr definiujący wywołanie zwrotne. jQuery tworzy losową funkcję służącą jako wywołanie zwrotne, więc jeśli twoim jedynym celem jest użycie tego jako CDN, nie możesz dynamicznie zmieniać nazwy wywołania zwrotnego w odpowiedzi.

Możesz użyć statycznego wywołania zwrotnego, przekazując odpowiednie parametry do 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. 

Wtedy twoja odpowiedź powinna wyglądać następująco:

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

To JSONP nie JSON isnt "jest? ... zasadniczo twoja odpowiedź mówi, aby użyć JSONP zamiast JSON. – themihai

+0

Erm, chyba trochę, ale nie rozumiem, jak to jest istotne. JSON i JSONP to faktycznie dwie różne rzeczy. JSON to format danych, a JSONP to mechanizm przesyłania. Byłoby to jak porównywanie XML-a z HTTP lub jabłka przeciwko pomarańczom. –

2

Możesz użyć JSONP lub użyć bezwzględnej ścieżki do subdomeny (zakłada się, że poddomena jest na tym samym serwerze, co musi być). Oznacza to, że zamiast https: bla bla, używałbyś/home/path_to_subdomain/etc. i to powinno działać.

JSONP to również dobre rozwiązanie, ale może to być przesada, jeśli można podać bezwzględną ścieżkę do subdomeny.

+0

OP chce używać poddomeny, aby pliki mogły być przechowywane na S3, a nie na tym samym serwerze. Plus "/ home/path_to_subdomain /" jest względną ścieżką, a nie ścieżką bezwzględną. –

Powiązane problemy