Как я могу получить доступ к заголовку длины содержимого из перекрестного домена Ajax Ajax?
-
27-10-2019 - |
Вопрос
Мое приложение JavaScript должно определить длину ресурса до Загрузка его с Ajax. Обычно это не проблема, вы просто делаете запрос на голову и извлекаете Content-Length
.
var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// "2195"
Тем не менее, ресурсы хранятся на другом сервере для клиента. (Сервер I управляю). Поэтому я использую CORS для выполнения запросов AJAX Cross Domain, и настраиваю сервер, чтобы ответить на предварительные запросы для запросов головки и получения запросов/публикаций с помощью пользовательских заголовков.
Это отлично работает в основном, но я не могу найти способ извлечения Content-Length
от ответа головы при работе с 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
что, по -видимому, спецификация должна сделать его доступным. Но независимо от того, что я делаю, я не могу сделать заголовок длины контента доступным для клиента. Какие-либо предложения?
(Хром 8)
Решение
Я обнаружил, что поддержка заголовка ответа CORS во всех браузерах была багги. В Chrome/Safari я вижу только простые заголовки ответов (http://www.w3.org/tr/cors/#terminology) в результате GetallResponseHeaders (), даже когда заголовок «Access-Control-Exe-expose» установлен в ответе. А в Firefox 3.6.13 GetallResponseHeaders () ничего не возвращает (даже не простые заголовки ответов). В качестве обходного пути, я полагаю, вы могли бы перегрузить один из простых заголовков ответа, чтобы включить длину контента, но это может вызвать другие проблемы, и все равно не исправят Firefox.
Другие советы
У меня была та же проблема, пока я не нашел нить в другом месте, которая научила меня добавлять эту линию на мою .htaccess:
Header add Access-Control-Expose-Headers "Content-Length"
Тогда бум, он был исправлен.