Usando AddEncoding x-gzip .gz sem arquivos reais

3

Com o Apache (2.2 e posterior), como posso conseguir o seguinte? Eu quero compactar transparentemente usando a codificação GZip ( não plain Deflate) a saída quando um determinado arquivo é consultado com seu nome mais a extensão .gz , onde a versão .gz não existe fisicamente disco.

Então, digamos que eu tenha um arquivo chamado /path/foo.bar e não arquivo foo.bar.gz na pasta para a qual o URI /path mapeia, como posso obter o Apache para servir o conteúdo de /path/foo.bar mas com AddEncoding x-gzip ... aplicado ao arquivo (não existente)?

A parte de reescrita parece ser fácil, mas o problema é como aplicar a codificação a um item inexistente. O inverso também parece ser simples, desde que o cliente suporte a codificação.

A única solução é realmente um script que faz isso na hora?

Estou ciente de mod_deflate e mod_gzip e não é o que estou procurando - pelo menos não sozinho. Em particular, eu preciso de um arquivo GZIP real e não apenas de um fluxo vazio.

Agora, eu estava pensando em usar mod_ext_filter, mas não consegui preencher a lacuna entre reescrever o nome do (não existente) file.gz to file de um lado e o LocationMatch do outro. Aqui está o que eu tenho.

RewriteRule ^(.*?\.ext)\.gz$ $1 [L]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<LocationMatch "/my-files/special-path/.*?\.ext\.gz">
    AddType application/octet-stream .ext.gz
    SetOutputFilter gzip
    Header set Content-Encoding gzip
</LocationMatch>

Observe que o cabeçalho para Content-Encoding não é realmente necessário para os clientes neste caso. Eles esperam ver arquivos GZIP reais, mas eu quero fazer isso sem precisar colocar em cache (este é um cenário de teste).

    
por 0xC0000022L 06.03.2012 / 20:17

2 respostas

2

Tudo bem, desculpe por responder minha própria resposta tão pouco tempo depois de oferecer a recompensa, mas eu finalmente descobri como realizar o que eu quero. Minha última edição da minha pergunta foi perto, mas não perto o suficiente.

Descobri que eu poderia abusar do fato de que mod_rewrite me permite definir o tipo MIME de um caminho reescrito ( T= ) para aplicar meu filtro (usando mod_ext_filter ) usando a diretiva AddOutputFilterByType como isso:

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,T=application/my-file-type]
ExtFilterDefine gzip mode=output cmd="/bin/gzip"
<Location "/my-files">
    AddOutputFilterByType gzip application/my-file-type
</Location>

Portanto, o arquivo real (por exemplo, somename.ext.gz ) não existe, mas somename.ext existe e mod_rewrite tem o cuidado de aplicar o filtro condicionalmente somente quando a solicitação é enviada a extensão .ext.gz , mas nunca se a solicitação chegar sob o nome (existente).

Tudo que fiz foi inventar meu próprio tipo MIME.

Como 200_success sugerido em seu comentário, ajustei isso mais uma vez para ficar mais legível e confiar em uma variável de ambiente (definida condicionalmente por mod_rewrite ):

RewriteRule ^(.*?\.ext)\.gz$ $1 [L,E=NEEDGZIP:1]
ExtFilterDefine gzip mode=output cmd="/bin/gzip" enableenv=NEEDGZIP
<Location "/my-files">
    SetOutputFilter gzip
</Location>
    
por 05.06.2012 / 03:48
-1

mod_gzip deve ser capaz de ajudá-lo

link

Aqui estão algumas configurações de amostra link

    
por 06.03.2012 / 22:46