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

Моему 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)

Ответы [ 2 ]

5 голосов
/ 06 июня 2014

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

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

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

3 голосов
/ 01 февраля 2011

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

...