#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 в сочетании с буферизацией вывода.