O armazenamento em cache indefinido de uma resposta HTTP via Nginx falha
-
20-12-2019 - |
Pergunta
Estou tentando dizer ao nginx para armazenar em cache alguns dos meus ativos (js, css) para sempre, ou pelo menos por muito tempo.
A ideia é que, uma vez compilado e publicado um pacote de ativos com um /assets/
Prefixo URI (por exemplo /assets/foo-{fingerprint}.js
) ele permanece lá e nunca precisa mudar.
Os internautas me disseram que eu deveria escrever a seguinte regra:
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
break;
}
Eu esperaria que isso resultasse em respostas com o código HTTP 304 "Não modificado", mas o que recebo é sempre um HTTP 200 (OK) consistente.
Eu tentei algumas outras abordagens, por exemplo:
a) definir explicitamente o tempo de modificação para um ponto constante no passado;
add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
b) mudar para If-None-Match
Verificações;
add_header ETag $1;
if_modified_since off;
No entanto, a única coisa que realmente funcionou conforme necessário foi esta:
add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;
Estou perdido.Isso é contrário a tudo que eu achava certo.Por favor ajude.
Solução
Você deveria mudar suas internets, pois elas te dão conselhos errados.
Basta remover tudo add_header
linhas de sua localização (bem como excedentes brake
):
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
}
e leia os documentos da verdadeira Internet: http://nginx.org/r/expires e http://tools.ietf.org/html/rfc2616
Outras dicas
Parece parte da minha configuração.Durante minha pesquisa percebi que o navegador usa análise heurística para validar solicitações com cabeçalhos ConditionalGet (E-Tag, Last-Modified).Faz muito sentido para respostas de back-end, então você pode lidar com isso para economizar recursos do servidor.
Mas em termos de arquivos estáticos (js, css, imagens), você pode dizer ao navegador para servi-los imediatamente, sem qualquer validação de obtenção condicional.É útil atualizar o nome do arquivo se ocorrer alguma alteração.
Esta parte da configuração faz com que isso aconteça:
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";