Como posso desabilitar o Transfer-Encoding: fragmentado no Apache com respostas HTTP / 1.1

5

Eu tenho uma página mod_include (SSI) que está gerando saída errônea durante a codificação em partes quando solicitada por um navegador HTTP / 1.1.

A página é gerada quando solicitada por um HTTP / 1.0 (porque a saída não está fragmentada).

Como posso dizer ao Apache não para usar codificação em partes quando solicitado por um navegador HTTP / 1.1?

Mais informações: A saída fragmentada errônea é causada por ter o suporte sendfile () ativado em uma máquina Solaris 5.10 com um processador sparc. Desabilitar o suporte a sendfile () faz com que esse problema desapareça; no entanto, estou tentando pegar esse bug e corrigi-lo.

    
por PP. 28.06.2010 / 15:41

3 respostas

8

Se você pré-especificar o tamanho do conteúdo, o Apache não precisará usar em partes. Sem Content-length, o Apache não tem outra opção senão usá-lo.

Para ser claro: o HTTP / 1.0 o gerencia porque o Apache lê toda a resposta antes de enviá-la, para que ela saiba o tamanho dela. Isso é hilário, ineficiente e lento, e o AFAIK não tem como habilitar essa lógica para solicitações HTTP / 1.1, exceto por forçá-las ao HTTP / 1.0 (o que você realmente não quer fazer, não é? , a variável de ambiente a definir é "downgrade-1.0" )

    
por 28.06.2010 / 16:03
7

A resposta acima está incorreta.

Se a solicitação for HTTP / 1.0, o Apache nunca armazena a resposta antes de enviá-la (com o cabeçalho Content-Length). É claro que o Apache poderia fazer isso, mas há uma solução mais elegante que o Apache usa: ele responde com o cabeçalho "Connection: close" e fecha a conexão assim que envia todos os dados.

De acordo com a especificação HTTP , a presença de "Conexão: fechar" cabeçalho significa que o cliente precisa ler até que a conexão seja fechada.

A solução para o seu problema é forçar o Apache a tratar a solicitação como HTTP / 1.0 configurando o downgrade mencionado. -1.0 variável de ambiente. A codificação Transfer-Chunked é um recurso HTTP / 1.1, e o Apache não a usará para solicitações HTTP / 1.0.

Por exemplo aqui está como você pode desativar respostas em pedaços para arquivos php:

++++++++++++
apache.conf
++++++++++++

<Files *.php>
    SetEnv downgrade-1.0
</Files>
    
por 13.07.2011 / 00:01
0

O cliente Apache tentará determinar o tamanho do corpo que está sendo enviado. Pre-0specifying "Content-Length" causará um erro, a menos que você use interceptores especiais.

Verifica a entidade que será enviada para identificar se está em bloco ou se o tamanho do corpo (tamanho do conteúdo) < 0 e se qualquer um for true, ele usa o cabeçalho "Transfer-Encoding = chunked". Se a entidade não preferir chunking e um comprimento de conteúdo > -1 é encontrado, em seguida, ele usa o cabeçalho "Content-Length".

Normalmente, se a fonte do corpo for uma parte do corpo mime, ele usará "Transfer-Encoding" porque uma chamada ao método size () retornará -1, portanto, a conversão da parte do corpo mime em uma matriz de bytes funcionará, pois retorna o número de bytes na matriz.

    
por 25.09.2018 / 12:54