У меня есть сценарий PHP, который обслуживает части файла PDF в байтовых диапазонах.
Если получен запрос HTTP HEAD, он должен отправлять обратно заголовки (включая размер файла PDF), но не фактическое содержимое файла. Я попробовал это:
header('HTTP/1.1 200 OK');
header('Content-Type: application/pdf');
header('Accept-Ranges: bytes');
header('Content-Length: '.filesize($Pathname));
die;
Проблема в том, что что-то (я полагаю, веб-сервер == LiteSpeed) заменяет заголовок Content-Length на Content-Length: 0
— который побеждает всю цель.
Кто-нибудь может подсказать, что мне делать? Спасибо
Из протокола передачи гипертекста w3c — HTTP / 1.1:
Когда длина сообщения указана в сообщении, где тело сообщения
разрешено, значение его поля ДОЛЖНО точно соответствовать количеству OCTET в
тело сообщения. HTTP / 1.1 пользовательские агенты ДОЛЖНЫ уведомлять пользователя, когда
неверная длина получена и обнаружена.
А также:
Поле заголовка объекта Content-Length указывает размер
Тело сущности, в десятичном числе OCTET, отправленное получателю или, в
случай метода HEAD, размер тела объекта, который будет
были отправлены, если запрос был получен.
Итак, я полагаю, ваш код будет работать правильно, если вы отправите настоящий запрос HEAD на ваш сервер.
Как отметил Лурий, длина контента зависит от типа вашего запроса.
При запросах GET несоответствующая длина контента может привести к зависанию клиента, поэтому LiteSpeed проверит длину контента перед отправкой заголовка клиенту.
Использование запроса HEAD должно возвращать длину содержимого, как ожидалось.
Это работа веб-сервера, а не ваша.
В моем случае я оставил все на веб-сервере Apache, и в моем php-коде ничего не изменилось, кроме того, как анализируются запросы
Например, такие вещи, как
if($_SERVER['REQUEST_METHOD'] === "GET"){
//ok
}else{
//send 400 Bad Request
}
изменены на
if($_SERVER['REQUEST_METHOD'] === "GET" || $_SERVER['REQUEST_METHOD'] === "HEAD"){
//ok
}else{
//send 400 Bad Request
}
и Апач сделал всю тяжелую работу (полосатое тело ответа).
(не пытайтесь ob_clean()
или же die("")
или тому подобное).
связанные ресурсы:
http://hc.apache.org/httpclient-3.x/methods/head.html
https://security.stackexchange.com/questions/62811/should-i-disable-http-head-requests