Como mod_rewrite configure para servir arquivos minified, se disponível?
-
04-07-2019 - |
Pergunta
Aqui está o problema: temos muitas Javascripts e lotes de arquivos CSS, que nós preferimos estar servindo minified. Minification é fácil: configurar o Compressor YUI, executar uma tarefa Ant, e ele cospe arquivos minified, que poupamos ao lado dos originais
.Então vamos acabar com a seguinte estrutura em algum diretório dentro do nosso DocumentRoot:
/ /js /min foo-min.js bar-min.js foo.js bar.js quux.js /css ...
Agora o que precisamos é que o Apache servir arquivos do min subdiretório, e fallback para servir arquivos descompactados , se suas versões minified não estão disponíveis. A última questão é o que eu não posso resolver.
Por exemplo: suponha que temos um pedido para example.com/js/foo.js - neste caso, o Apache deve enviar conteúdo de /js/min/foo-min.js . Não há como minified quux.js , então pedido para /js/quux.js retorna /js/quux.js em si, e não 404. finalmente, se não há nenhuma /js/fred.js , que deve acabar com 404.
Na verdade, eu estou definindo scripts de construção de tal maneira a que os arquivos unminified não são implantados no servidor de produção, mas essa configuração pode ainda ser útil em um servidor de integração e em máquinas de desenvolvimento.
Solução
Aqui está a configuração que finalmente funcionou:
/js/.htaccess:
RewriteEngine On
RewriteBase /js
RewriteCond %{REQUEST_URI} ^/js/((.+)\.js)$
RewriteCond %{DOCUMENT_ROOT}/js/min/%2-min.js -f
RewriteRule ^(.+)$ min/%2-min.js [L]
Mesmo para css diretório.
Outras dicas
Você pode usar RewriteCond para detectar a presença de um arquivo minified:
RewriteCond %{REQUESTURI} ^/js/(.*\.js)
RewriteCond js/min/%1 -f
RewriteRule %1 min/%1 [L]
É possível alterar os seus scripts de construção? Se assim for, você pode configurá-los para apoucar os arquivos e dar-lhes o mesmo nome do arquivo, mas apenas quando prestados a bandeira apropriada, por exemplo, ant productionDeploy
vez de ant integrationDeploy
. Dessa forma, o processo de minimização é completamente transparente para tudo, exceto o script de construção.