Apache: Envie arquivos compactados com gzip

8

Eu quero que o Apache envie arquivos estáticos compactados por zíper, mas também quero que o Apache nem sempre os compacte repetidamente. Por isso, pensei que não seria possível entregar um arquivo .gz, se existir. Esta configuração:

Estrutura do arquivo:

static/
|
|--- style.css
|
\--- style.css.gz

E o seguinte em um .htaccess:

regra mod_rewrite:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz [L]

E essa configuração:

AddEncoding x-gzip .gz

Na verdade, isso funciona na medida em que o arquivo .gz é enviado em vez do .css, se a solicitação for enviada /static/style.css. O problema é apenas que o arquivo é entregue como "application / x-gzip" e não como "text / css". Usar o sinalizador T de mod_rewrite não altera isso. Nem um explícito

AddType text/css .css

Alguém tem uma idéia, como eu poderia alcançar o comportamento desejado? Ou é desnecessário, por algum motivo, que não considero?

EDIT: Há uma dificuldade adicional: Enviar o arquivo original para clientes sem suporte ao gzip. Alguém tem uma idéia de como isso poderia funcionar?

Boldewyn
fonte
Estou surpreso que isso não seja muito mais óbvio, pois parece loucura ter um servidor web que não faça isso. Eu acho que o IIS tem um sistema para armazenar em cache cópias compactadas de arquivos estáticos no primeiro acesso. mod_deflate não menciona esse recurso.
Rjmunro 11/11/2009
docs mod_deflate do Apache têm o seu próprio exemplo agora: httpd.apache.org/docs/2.4/mod/mod_deflate.html#precompressed
cweiske

Respostas:

5

Uma solução para enviar a versão correta para navegadores que não aceitam o gzip seria algo como:

RewriteCond %{HTTP:Accept-Encoding} !gzip
...your rules here...

Além disso, há outra maneira de alterar o tipo, a saber:

<FilesMatch .*\.css.gz>
    ForceType text/css
</FilesMatch>

<FilesMatch .*\.js.gz>
    ForceType text/javascript
</FilesMatch>

HTH.

Sam Halicke
fonte
Legal, obrigado! Existem documentos para o% {HTTP: ...}? Não vi nenhuma menção a isso na seção RewriteCond do Apache 2.2. O FilesMatch foi outra ideia que tive, mas achei mais detalhada. Como as duas regras precisam iniciar o mecanismo regexp, não deve haver diferença real.
Boldewyn 27/10/2009
OK, encontrei os documentos. httpd.apache.org/docs/2.2/mod/mod_rewrite.html Acabei de pular a parte interessante.
Boldewyn 27/10/2009
Não é um problema enorme, mas a leitura dessa configuração, se alguém buscasse manualmente o arquivo .css.gz, receberia o texto / css, quando deveria obter o tipo application / x-gzip.
Rjmunro 11/11/2009
Porque o ! antes do gzip na linha Accept-Encoding? Certamente esse é o oposto do que você precisa?
Rjmunro 11/11/2009
Eu estava pensando o mesmo, faz sentido ter a RewriteCondcorresponder apenas quando o cliente faz aceitar a codificação gzip.
David Z
3

Ah, parece que encontrei uma solução: o sinalizador T não funciona se definido na mesma regra, mas com certeza funciona, se você usar uma regra própria:

RewriteCond %{REQUEST_FILENAME}.gz -s
RewriteRule ^(.+) $1.gz

RewriteRule \.css\.gz$ - [T=text/css]
RewriteRule \.js\.gz$ - [T=text/javascript]

Ainda assim, gostaria de ouvir as soluções e opiniões de outras pessoas.

Boldewyn
fonte