Force Cache-Refresh no CloudFront com controle de versão virtual

Recentemente, começamos a usar o Amazon CloudFront para hospedar / armazenar em cache ativos de sites de grandes clientes.

Combinado com cabeçalhos de cache de futuro distante (que você realmente deveria usar!), Você pode diminuir o tráfego de seus servidores de forma significativa.

Mas há uma desvantagem com o Cloudfront. Se você deseja enviar novos conteúdos de um arquivo para o mundo, você precisa renomeá-lo (e todas as referências a ele) ou iniciar a invalidação de cache no painel Cloudfront (o que custa dinheiro extra?).

Como solução, introduzi a versão virtual dos nomes das pastas adicionando uma regra de reescrita de uma linha no arquivo .htaccess do nosso servidor.

Ao vincular a arquivos, usamos “/assets/version_2013-02-14/backgroundimages/1.jpg” como URL (com qualquer coisa atrás de “version_”), e os arquivos estão sempre em “/assets/backgroundimages/1.jpg”.

<IfModule mod_rewrite.c>
RewriteRule ^assets/version_(.+)/(.*) /assets/$2 [L]

</IfModule>

Quando você deseja forçar o CloudFront para buscar a nova versão de um arquivo, basta alterar a string por trás de “version_”. O Cloudfront não conhece esse arquivo, busca-o em seu servidor (onde o único arquivo existente é extraído recentemente) e o serve, desde que você não altere a parte de versão do URL.

Usar parâmetros como “1.jpg? V = 2013-02-14” não é uma boa ideia, pois tem uma taxa de cache pior com navegadores e proxies.

(Vejo que há muitos casos em que você pode simplesmente renomear o próprio arquivo. Mas, em nosso caso, essa não era a solução preferida.)