Acabamos de migrar para Amazon AWS. Atualmente, temos uma instância do EC2 que está funcionando bem. Ele está executando o Nginx na frente e o Apache no back-end. Isso está funcionando bem também. Todos os sites são iniciados corretamente e incluem o cabeçalho Cache-Control para arquivos que são servidos do EC2.
O problema está em TODOS os arquivos estáticos que colocamos no Amazon S3 que estão sendo acessados por meio do CloudFront CDN . Podemos acessar os arquivos sem problemas (e sem problemas com o CORS), mas aparentemente o CloudFront não atende arquivos com o cabeçalho Cache-Control. Queremos aproveitar o cache do navegador.
A meu ver, a instância do EC2 não desempenha um papel aqui, pois os arquivos estáticos estão sendo atendidos diretamente pelo S3+CloudFront, a solicitação não vai para o servidor Web no EC2.
Estou completamente perdido.
Pergunta: 1) Como faço para configurar o Cache-Control neste caso? 2) É possível definir o Cache-Control? Do S3 ou do CloudFront?
Observação: encontrei algumas páginas no Google onde você pode definir o cabeçalho no S3 para objetos individuais. Essa não é realmente uma maneira produtiva de fazer isso, especialmente porque no meu caso estamos falando de vários objetos.
Obrigado!
Bem, "produtivo" ou não, é assim que ele foi projetado para funcionar.
O CloudFront não adiciona
Cache-Control:
cabeçalhos.O CloudFront passa (e também respeita, a menos que configurado de outra forma) os
Cache-Control:
cabeçalhos fornecidos pelo servidor de origem, que neste caso é o S3.Para obter
Cache-Control:
cabeçalhos fornecidos pelo S3 quando um objeto é buscado, eles devem ser fornecidos quando o objeto é carregado no S3 ou adicionados aos metadados do objeto por uma operação put+copy subsequente, que pode ser usada para copiar internamente um objeto em si mesmo em S3, modificando os metadados no processo. Isso é o que o console faz, nos bastidores, se você editar os metadados do objeto.Também não há (caso você esteja se perguntando) nenhuma configuração global no S3 para forçar todos os objetos em um balde a retornar esses cabeçalhos - é um atributo por objeto.
Atualização: Lambda@Edge é um novo recurso do CloudFront que permite disparar gatilhos contra solicitações e/ou respostas, entre visualizador e cache e/ou cache e origem, executando código escrito em Node.js em uma estrutura simples de objeto de solicitação/resposta expostos pelo CloudFront.
Um dos principais aplicativos para esse recurso é a manipulação de cabeçalhos... portanto, embora o acima ainda seja preciso -- o próprio CloudFront não adiciona
Cache-Control
-- agora é possível para uma função do Lambda adicioná-los à resposta que é retornada do CloudFront.Este exemplo adiciona
Cache-Control: public, max-age=86400
apenas se não houver umCache-Control
cabeçalho já presente na resposta.O uso desse código em um gatilho de resposta de origem faria com que ele disparasse sempre que o CloudFront buscasse um objeto da origem e modificasse a resposta antes que o CloudFront o armazenasse em cache.
Atualização (20/06/2018): Recentemente, enviei uma solicitação de recurso à equipe do CloudFront para permitir a configuração de cabeçalhos de resposta de origem estática como atributos de origem, semelhante à maneira como os cabeçalhos de solicitação estática podem ser adicionados, agora... twist, permitindo que cada cabeçalho seja configurado para ser adicionado condicionalmente (somente se a origem não forneceu esse cabeçalho na resposta) ou incondicionalmente (adicionando o cabeçalho e substituindo o cabeçalho da origem, se presente).
Com solicitações de recursos, você normalmente não recebe nenhuma confirmação se eles estão realmente pensando em implementar o novo recurso... ou mesmo se já podem estar trabalhando nele... é apenas anunciado quando eles terminam. Portanto, não tenho ideia se isso será implementado. Há um argumento a ser feito de que, como esse recurso já está disponível via Lambda@Edge, não há necessidade dele na funcionalidade básica... fazer uma manipulação simples e estática do cabeçalho de resposta e que, se esse for o único motivo pelo qual um gatilho é necessário, exigir gatilhos do Lambda é um custo desnecessário, financeiramente e em latência adicional (mesmo que nenhum dos dois seja necessariamente um custo exorbitante).
Desde novembro de 2021 , isso agora pode ser feito nativamente no Cloudfront sem usar uma função Lambda@Edge.