2017-01-04 4 views
2

У меня есть PHP-скрипт, который обслуживает части PDF-файла по байтовым диапазонам.Ответ PHP на запрос HEAD

Если получен запрос 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 - который побеждает всю цель.

Может ли кто-нибудь предложить, что я должен делать? Благодаря

+0

Вы проверили правильность '$ Pathname'? – Paul

+0

Откуда вы знаете, что его заменили? –

+0

@Paul да переменная $ Pathname определенно верна. Я также написал файл журнала, который подтверждает, что fileize ($ Pathname) является фактическим размером файла. – oomp

ответ

4

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

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

А:

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

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

+0

Я не вижу, что реальный запрос HEAD будет иметь значение, поскольку ответ PHP не зависит от запроса inital, не так ли? – oomp

+1

«Я не вижу, что реальный запрос HEAD будет иметь какое-либо значение» - я могу.Это решительно возлагает вину на дверь веб-сервера, а не на PHP или ваш код (при условии, что вы получите такое же поведение в ответ на запрос HEAD). – symcbean

+0

@oomp просто попробуйте. Вы можете использовать curl -i -D -I-HEAD http: // yourserver.com (без пробела между http: // и доменным именем) или Postman –

0

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

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

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

Смежные вопросы