2011-01-31 10 views
15

Moja aplikacja JavaScript musi określić długość zasobu przed pobierając go z Ajax. Zazwyczaj nie stanowi to problemu, wystarczy, że wykonasz żądanie HEAD i wyodrębnisz Content-Length.Jak uzyskać dostęp do nagłówka Content-Length z żądania ajaxowego między domenami?

var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"}) 
xhr.getResponseHeader("Content-Length") 
// "2195" 

Jednak zasoby są przechowywane na innym serwerze niż klient. (Serwer, który kontroluję). Używam więc CORS do wysyłania zapytań ajaxowych w domenie krzyżowej i skonfigurowałem serwer do odpowiadania na żądania preflightów dla żądań HEAD i GET/POST z niestandardowymi nagłówkami.

To działa świetnie w głównym, ale nie wydaje się znaleźć sposób wyodrębnić z Content-Length z odpowiedzi HEAD podczas pracy z CORS:

var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"}) 
xhr.getResponseHeader("Content-Length") 
// ERROR: Refused to get unsafe header "Content-Length" 

Mam eksperymentował z ustawieniem różnych nagłówków w preflightu lub w odpowiedzi, takie jak

Access-Control-Expose-Headers: Content-Length 

którego specyfikacja wydaje się sugerować, powinna udostępnić go. Ale nie ważne, co robię, nie wydaje mi się, aby nagłówek Content-Length był dostępny dla klienta. Jakieś sugestie?

(Chrome 8)

Odpowiedz

3

Znalazłem odpowiedź wsparcie nagłówek CORS we wszystkich przeglądarkach być wadliwy. W Chrome/Safari widzę tylko proste nagłówki odpowiedzi (http://www.w3.org/TR/cors/#terminology) w wyniku działania getAllResponseHeaders(), nawet jeśli nagłówek "Access-Control-Expose-Headers" jest ustawione w odpowiedzi. W Firefoksie 3.6.13 funkcja getAllResponseHeaders() nie zwraca niczego (nawet prostych nagłówków odpowiedzi). W celu obejścia tego problemu prawdopodobnie można obciążyć jeden z prostych nagłówków odpowiedzi, aby uwzględnić długość treści, ale może to powodować inne problemy i nadal nie naprawi Firefoksa.

+0

Dobrze. Czy uważasz, że powinno to zostać zgłoszone jako błąd w Webkit? –

+0

Tak. Najpierw spróbuj wyszukać, myślałem, że widziałem wcześniej błąd, ale nie mogę go teraz znaleźć. – monsur

5

miałem ten sam problem, aż znalazłem wątku gdzieś indziej, że nauczył mnie, aby dodać tę linię na moim .htaccess:

Header add Access-Control-Expose-Headers "Content-Length" 

Then Boom, że to naprawione.

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers po szczegóły – broofa

Powiązane problemy