Назад | Перейти на главную страницу

Заголовок Content-Length не существует

У меня на Linux установлен сервер nginx. Когда я отправляю запрос с помощью curl, Content-Length заголовок отсутствует в ответе.

Файл 1.php:

<?php
   echo "hello";
?>

Пример запроса:

curl api.mysite.com/taxi/1.php -i

HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Wed, 17 Sep 2014 06:16:00 GMT
Content-Type: text/html; charset=utf8
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.4-14+deb7u14
Age: 0
X-Cache: MISS from cache.turonnet.uz
Transfer-Encoding: chunked
Connection: keep-alive

Как я могу это исправить?

content-length не может быть установлен, если Transfer-Encoding должен быть chunked. Во время отправки заголовков сервер не знает, сколько данных он наконец отправит. У каждого блока есть собственное поле заголовка длины (см. RFC).

Если подумать, в отличие от статического файла HTML, веб-сервер не имеет возможности узнать, сколько данных будет сгенерировано сценарием PHP. Он может либо кэшировать сгенерированный файл и отправлять его после завершения сценария, либо отправлять его по частям, пока он создается. Последнее предпочтительнее, особенно для сценариев с большим объемом вывода и длительным временем выполнения.

Nginx не знает длины, потому что php генерирует динамический контент. Вы можете сначала записать в выходной буфер php, а затем вручную установить поле заголовка перед очисткой буфера.