Подтвердить что ты не робот

Как я могу получить доступ к заголовку Content-Length из запроса Ajax для перекрестного домена?

Мое приложение JavaScript должно определить длину ресурса перед загрузкой с помощью Ajax. Обычно это не проблема, вы просто делаете запрос HEAD и извлекаете Content-Length.

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

Однако ресурсы хранятся на другом сервере для клиента. (Я контролирую сервер). Поэтому я использую CORS для создания запросов ajax для перекрестных доменов и настроил сервер для ответа на предпроверочные запросы на запросы HEAD и запросы GET/POST с пользовательскими заголовками.

Это отлично работает в основном, но я не могу найти способ извлечь Content-Length из ответа HEAD при работе с CORS:

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

Я экспериментировал с настройкой различных заголовков в предполетном или в ответе, например

Access-Control-Expose-Headers: Content-Length

который, по-видимому, предлагает спецификация, должна сделать ее доступной. Но независимо от того, что я делаю, я не могу сделать заголовок Content-Length доступным для клиента. Любые предложения?

(Chrome 8)

4b9b3361

Ответ 1

Я нашел поддержку заголовка ответа CORS во всех браузерах ошибкой. В Chrome/Safari я вижу только простые заголовки ответов (http://www.w3.org/TR/cors/#terminology) в результате getAllResponseHeaders(), даже если заголовок "Access-Control-Expose-Headers" задается в ответе. А в Firefox 3.6.13 getAllResponseHeaders() ничего не возвращает (даже простые заголовки ответов). В качестве обходного пути я предполагаю, что вы можете перегрузить один из простых заголовков ответов, чтобы включить длину содержимого, но это может вызвать другие проблемы и по-прежнему не будет исправлять Firefox.

Ответ 2

У меня была такая же проблема, пока я не нашел нить в другом месте, которая научила меня добавлять эту строку в мой .htaccess:

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

Затем BOOM, он был исправлен.