В заголовке HTTP Content-Length слишком много на 1 байт

#php #apache #http #http-headers #content-length

#php #apache #http #http-заголовки #content-length

Вопрос:

Я пишу скрипт (PHP), который отправляет файлы клиенту. Среди прочего отправляется заголовок Content-Length, только в нем на один байт больше, чем нужно. Я обнаружил это, когда поместил длину содержимого в другой заголовок и сравнил два:

 $filesize = filesize($file);
header('Content-Length: ' . $filesize);
header('X-Content-Length: ' . $filesize);
  

Результат:

 Content-Length: 3481
X-Content-Length: 3480
  

Даже при жестком кодировании 3480 в header() функцию результат таков. Я подозреваю, что Apache делает это с моими заголовками.

Что может быть причиной этого?

Редактировать: Чтобы дать некоторый контекст: я думаю, что причиной этого является Zend Framework: я рефакторирую код, который в настоящее время находится в производстве (и работает), в ZF, где возникает проблема. Когда я пробую этот код за пределами ZF, все хорошо. Возможно, ZF выполняет буферизацию вывода и повторную отправку самих заголовков или что-то в этом роде, но я не очень хорошо знаю ZF.

Комментарии:

1. Какое значение является правильным?

2. возможно, ваш скрипт выводит 1 символ перед содержимым файла. попробуйте написать ob_start(); в первой строке и ob_end_flush(); перед выводом содержимого файла.

3. @Alvaro 3480, пользовательский заголовок оставлен в покое, заголовок фактической длины содержимого, очевидно, изменен перед отправкой.

4. Подозрительно, что разница составляет всего один байт. Возможно ли, что это текстовый файл в Юникоде, и Zend добавляет спецификацию? Вы сравнивали файл до и после с помощью инструмента сравнения файлов? Используете ли вы сжатие HTTP?

5. Спасибо OZ_, ты наставил меня на правильный путь. Zend использует буферизацию вывода, и пара PHP-файлов начинается с пробела. Когда я удалил это, это сработало. 1

Ответ №1:

Это было сделано не Apache, а пробелом перед тегом PHP open в сочетании с буферизацией вывода.