Apache enviando Transfer-Encoding: chunked

2

Existe um servidor Apache no Solaris que envia 'Transfer-Encoding: chunked' e não envia o cabeçalho 'Content-Length' que tenho no meu PHP (usado para baixar arquivos). Você conhece uma maneira de evitar isso?

Obrigado

Veja: link

Eu tentei a diretiva

 SetEnvIfNoCase Request_URI get_file\.php$ no-gzip dont-vary

e agora eu recebo um arquivo com o mesmo tamanho de arquivo do original, mas o arquivo está corrompido. Aqui estão os cabeçalhos recebidos do servidor:

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
por rtacconi 26.08.2009 / 16:55

2 respostas

4

A saída em partes ocorre quando o Apache não sabe o tamanho total da saída antes do envio, como é o caso da transferência compactada (o Apache compacta os dados em partes quando atingem um determinado tamanho e os envia ao navegador / solicitante enquanto o script ainda está sendo executado). Você pode estar vendo isso porque tem mod_deflate ou mod_gzip active. Você pode verificar se esse é o seu problema aqui .

Você pode desativar mod_deflate por arquivo assim ( mais aqui )

    SetEnvIfNoCase Request_URI get_file\.php$ no-gzip dont-vary

É melhor deixá-lo em geral, pois aumenta muito a velocidade da transferência de dados.

    
por 26.08.2009 / 17:36
3

O filtro de saída do Apache 2 adicionará automaticamente um cabeçalho de comprimento de conteúdo ele vê um marcador de fim de fluxo (EOS) E nada foi enviado ainda. código fonte:

if (ctx->data_sent == 0 && eos) {
  ap_set_content_length(r, r->bytes_sent);
}

Se o PHP passar qualquer dado para o Apache antes de enviar o EOS, então chunking acontece. O PHP usa um buffer de saída de 4096 bytes por padrão. Qualquer página menor do que isso não vai ficar em pedaços.

Verifique também se o conteúdo é alimentado via gzip (mod_gzip) e é comprimido O apache, em seguida, passará para a codificação em partes.

    
por 26.08.2009 / 17:40

Tags