http — PHP ответ на запрос HEAD

У меня есть сценарий 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 — который побеждает всю цель.

Кто-нибудь может подсказать, что мне делать? Спасибо

4

Решение

Из протокола передачи гипертекста w3c — HTTP / 1.1:

Когда длина сообщения указана в сообщении, где тело сообщения
разрешено, значение его поля ДОЛЖНО точно соответствовать количеству OCTET в
тело сообщения. HTTP / 1.1 пользовательские агенты ДОЛЖНЫ уведомлять пользователя, когда
неверная длина получена и обнаружена.

А также:

Поле заголовка объекта Content-Length указывает размер
Тело сущности, в десятичном числе OCTET, отправленное получателю или, в
случай метода HEAD, размер тела объекта, который будет
были отправлены, если запрос был получен.

Итак, я полагаю, ваш код будет работать правильно, если вы отправите настоящий запрос HEAD на ваш сервер.

6

Другие решения

Как отметил Лурий, длина контента зависит от типа вашего запроса.

При запросах GET несоответствующая длина контента может привести к зависанию клиента, поэтому LiteSpeed ​​проверит длину контента перед отправкой заголовка клиенту.

Использование запроса HEAD должно возвращать длину содержимого, как ожидалось.

0

Это работа веб-сервера, а не ваша.

В моем случае я оставил все на веб-сервере 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

Ответ Apache 2.2.2 на запросы HEAD

0
По вопросам рекламы [email protected]