Apache отправляет Transfer-Encoding: chunked
В Solaris есть сервер Apache, который отправляет "Transfer-Encoding: chunked" и не отправляет заголовок "Content-Length", который есть в моем PHP (используется для загрузки файлов). Вы знаете способ предотвратить это?
Спасибо
Смотрите: https://stackoverflow.com/questions/1334471/content-length-header-always-zero
Я попробовал директиву
SetEnvIfNoCase Request_URI get_file\.php$ no-gzip dont-vary
и теперь я получаю файл с тем же размером файла оригинала, но файл поврежден. Вот заголовки, полученные с сервера:
http://example.com/output_file_download.php?fileID=130
GET /output_file_download.php?fileID=130 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: user_id=7C%25R; intrauser=kE06Ub%238+2dHT%29U0t%28B%2A; intrakey=rtacconi; PHPSESSID=5a3f8edff822474f3b95b6a6e5c87ad2
HTTP/1.x 200 OK
Date: Thu, 03 Sep 2009 10:02:05 GMT
Server: Apache
Expires: 0
Cache-Control: private
Pragma: public
Content-Description: File Transfer
Content-Disposition: attachment; filename=alfresco-logo.gif
Content-Transfer-Encoding: binary
Content-Length: 2401
Keep-Alive: timeout=15, max=500
Connection: Keep-Alive
Content-Type: application/octet-stream
2 ответа
Чанкированный вывод происходит, когда Apache не знает общий размер вывода перед отправкой, как в случае со сжатой передачей (Apache сжимает данные в чанки, когда они достигают определенного размера, а затем отправляет их в браузер / запросчик, пока сценарий еще выполняется). Вы могли видеть это, потому что у вас есть mod_deflate
или же mod_gzip
активный. Вы можете проверить, если это ваша проблема здесь.
Вы можете отключить mod_deflate
за файл вроде так ( подробнее здесь)
SetEnvIfNoCase Request_URI get_file \.php $ no-gzip не изменять
В общем, лучше оставить его, так как это значительно увеличивает скорость передачи данных.
Выходной фильтр Apache 2 автоматически добавит заголовок длины содержимого, если обнаружит маркер конца потока (EOS) И ничего еще не было отправлено. исходный код:
if (ctx->data_sent == 0 && eos) {
ap_set_content_length(r, r->bytes_sent);
}
If PHP passes any data down to Apache before it sends EOS, then chunking happens. PHP uses a output buffer of 4096 bytes by default. Any page smaller than that will not get chunked.
Also check if the content is fed via gzip (mod_gzip) and gets compressed apache will then turn to chunked encoding.