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

Apache и растущие файлы

У меня есть сценарий FastCGI, который начинает создание файла для запроса и отправляет клиенту заголовок перенаправления с указанием местоположения нового файла сразу после того, как первая часть этого файла была записана на жесткий диск. Все работает нормально, но когда клиент запрашивает файл из перенаправления, он получает заголовок Content-lenght с длиной файла, который уже был записан в файл, когда запрос был сделан, и клиент не получает часть файла, который был создан после запроса.

Как я могу настроить Apache, чтобы не отправлять заголовок Content-lenght для незавершенных файлов и продолжать отправлять файлы, пока он не отправит весь завершенный файл?

С Уважением,

Михал Пьетрас.

Согласно ответь здесь, для этого вам необходимо изменить исходный код apache. Согласно вопрос и ответ здесь, если вы включите сжатие gzip в apache, это будет иметь побочный эффект в виде отключения заголовка длины содержимого, поскольку apache не будет знать длину, пока не будет выполнено сжатие, и к тому времени он уже не начал отправлять сжатые данные.

В любом случае, я не думаю, что то, что вы пытаетесь сделать, сработает, если только ваш «первый кусок этого файла» не настолько велик, что Apache не сможет прочитать его до конца (буфер Apache, буфер отправки TCP вашего ядра, ваш сетевой буфер и т. д.), прежде чем записывать в него еще один большой кусок данных. Также обратите внимание, что если apache использует sendfile () (а это почти наверняка в Linux, если вы не используете gzip, SSL или ты выключаешь это), то длина данных для отправки предоставляется функции sendfile (), и это будет длина файла на момент начала отправки apache.

Я не тестировал, но попробуйте использовать mod_header:

Header unset Content-Length

Вы можете поместить это в раздел каталога, если неполные файлы находятся в одном каталоге, или в другом блоке, если это более целесообразно.

Обратите внимание, что это нарушает поведение RFC, и я не уверен, действительно ли Apache сможет передать весь файл после удаления заголовка - насколько нам известно, он все еще может использовать внутренний счетчик, независимый от этого конкретного заголовка.

Я не уверен, следую ли я за вашим вопросом, но похоже, что у вас есть процесс, который начинает писать в файл A отправляет клиенту сообщение о перенаправлении серии 3xx, говорящее ему перейти к файлу A, затем продолжает запись в файл A.

Если это то, что происходит, ваш клиент, вероятно, запрашивает File A до того, как он будет записан, и он получит верный content-length для содержимого файла когда это было запрошено.
Если вы хотите отправить весь файл, вам необходимо закончить запись в него, прежде чем выполнять перенаправление.