Acabamos de migrar para o Amazon AWS. Atualmente, temos uma instância do EC2 que está funcionando bem. Está executando o Nginx na frente e o Apache no back-end. Está funcionando bem também. Todos os sites são iniciados corretamente e incluem o cabeçalho de controle de cache para arquivos servidos no 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 corretamente (e não há problema com o CORS), mas aparentemente o CloudFront não serve arquivos com o cabeçalho de controle de cache. Queremos aproveitar o cache do navegador.
Do meu ponto de vista, 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 defino o Cache-Control neste caso? 2) É possível definir o controle de cache? Do S3 ou CloudFront?
Nota: Encontrei algumas páginas no Google onde é possível 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!
Respostas:
Bem, "produtivo" ou não, é assim que ele é projetado para funcionar.
O CloudFront não adiciona
Cache-Control:
cabeçalhos.O CloudFront passa (e também respeita, a menos que seja configurado de outra forma) os
Cache-Control:
cabeçalhos fornecidos pelo servidor de origem, que neste caso é 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. S3, modificando os metadados no processo. É isso que o console faz, nos bastidores, se você editar os metadados do objeto.Também não há (no caso de você estar se perguntando) nenhuma configuração global no S3 para forçar todos os objetos em um bucket a retornar esses cabeçalhos - é um atributo por objeto.
Atualização: 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 o código escrito no Node.js em uma estrutura simples de objeto de solicitação / resposta exposto pelo CloudFront.
Uma das principais aplicações desse recurso é a manipulação de cabeçalhos ... portanto, enquanto o que precede ainda é preciso - o próprio CloudFront não adiciona
Cache-Control
- agora é possível que uma função Lambda os adicione à resposta retornada do CloudFront.Este exemplo é adicionado
Cache-Control: public, max-age=86400
apenas se ainda não houverCache-Control
cabeçalho presente na resposta.O uso desse código em um gatilho de resposta à origem faria com que ele disparasse toda vez que o CloudFront buscar um objeto na origem e modifique a resposta antes que o CloudFront o armazene 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 à forma como os cabeçalhos de solicitação estática podem ser adicionados, agora ... mas com um 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 sobre se eles estão realmente pensando em implementar o novo recurso ... ou mesmo se eles já podem estar trabalhando nele ... é anunciado apenas quando terminar. Então, eu não tenho idéia se estes serão implementados. Existe um argumento a ser argumentado que, como esse recurso já está disponível via Lambda @ Edge, não há necessidade dele na funcionalidade base ... mas meu contra-argumento é que a base funcionalmente não é funcionalmente completa sem a capacidade de faça manipulação simples e estática do cabeçalho de resposta e que, se esse for o único motivo para o acionamento, exigir o acionamento do Lambda é um custo desnecessário, financeiramente e com maior latência (mesmo que nenhum seja necessariamente um custo estranho).
fonte