У меня на 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, а затем вручную установить поле заголовка перед очисткой буфера.