Servir ativos pré-compactados por meio do Apache

Olá!

Há muito tempo, compartilhei com alguns colegas que é possível servir arquivos compactados (gz) diretamente do Apache e economizar largura de banda de rede com ele.

Eu estava mais acostumado com o Nginx, então confesso que conseguir isso com o Apache foi um pouco mais complicado.

Depois de alguns ajustes na configuração do host virtual Apache, usando o modo deflate para servir os ativos compactados, tive um problema. Meus arquivos parecem estar compactados duas vezes. Pesquisando um pouco, encontrei esta resposta stackoverflow http://stackoverflow.com/a/7510773/537235 que resolve meu problema.

Se você estiver usando Rails e pré-compilar seus ativos, ele irá diminuir e compactar para você. Portanto, você não é obrigado a configurar o modo de deflate do Apache, porque você estará servindo conteúdo pré-compactado, em vez de compactar durante o tempo de solicitação, o que pode ser caro para o seu servidor.

A solução a seguir funciona bem com a configuração de host virtual de .htaccess. Não é comum para mim colocar um arquivo .htaccess dentro da pasta public / assets em uma aplicação Rails, então, eu fiz usando o host virtual.

<VirtualHost *:80>

ServerName mywebsite.com


DocumentRoot /my/rails_app/public


<Directory /my/rails_app/public>
AllowOverride all

Options -MultiViews

</Directory>

<Location /assets/>
RewriteEngine on


# Make sure the browser supports gzip encoding before we send it

# without it, Content-Type will be "application/x-gzip"


RewriteCond %{HTTP:Accept-Encoding} b(x-)?gzipb

RewriteCond %{REQUEST_FILENAME}.gz -s

RewriteRule ^(.+) $1.gz [L]

</Location>

# Also add a content-encoding header to tell the browser to decompress


<FilesMatch .css.gz$>
ForceType text/css

Header set Content-Encoding gzip

</FilesMatch>

<FilesMatch .js.gz$>
ForceType text/javascript

Header set Content-Encoding gzip

</FilesMatch>

</VirtualHost>

Espero que isso ajude você também.