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.

Foi útil?

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 "";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top