web-dev-qa-db-fra.com

nginx: désactive la mise en cache d'un seul fichier avec la directive try_files

Je sers nginx avec Angular 2 application en utilisant la section location de cette façon:

location / {
  try_files $uri $uri/ /index.html =404;
}

la directive try_files essaie de trouver l'URI demandé dans le répertoire racine et si elle ne parvient pas à en trouver un, elle retourne simplement index.html

Comment désactiver la mise en cache du fichier index.html?

7
Rem

Vous avez trouvé une solution utilisant les emplacements nommés nginx:

location / {
    gzip_static on;
    try_files $uri @index;
}

location @index {
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
}
18
Rem
location / {
  try_files $uri $uri/ /index.html;
}

location = /index.html {
  expires -1;
}
1
Dmitry MiksIr

Merci pour une bonne réponse Rem! Comme le souligne He Shiming avec la solution acceptée, les en-têtes de mise en cache ne sont pas ajoutés lors de la visite de la racine, par exemple. www.example.com/, mais soyez ajouté lorsque vous visitez un lien profond, par exemple. www.example.com/some/path.

Après avoir beaucoup creusé, je pense que cela est dû au comportement par défaut du module ngnix ngx_http_index_module , il inclut par défaut index.html. .html est servi sans les en-têtes de contrôle du cache. La solution de contournement que j’avais utilisée était d’inclure une directive index sans spécifier index.html dans le premier bloc d’emplacement, forçant la racine/à servir à partir du deuxième bloc d’emplacement.

J'ai également eu un autre problème, j'ai inclus une directive racine dans le premier bloc d'emplacement, qui cassait les liens profonds et était également une mauvaise idée . J'ai déplacé la directive racine au niveau du serveur.

J'espère que cela aide, c'est ma solution ...

server {
  listen       80;
  server_name  localhost;
  root   /usr/share/nginx/html;

  location / {
    add_header X-debug-whats-going-on 1;
    index do-not-use-me.html;
    try_files $uri @index;                 
  }

  location @index {
    add_header X-debug-whats-going-on 2;
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
  }
}

J'ai inclus des en-têtes de débogage pour indiquer clairement quel bloc d'emplacement sert quel contenu. Il est également intéressant de noter le comportement non intuitif de la directive add_header , lecture essentielle si vous avez également l'intention d'ajouter des en-têtes à toutes les demandes en dehors d'un bloc d'emplacement.

1
Simon Ness

La configuration suivante fonctionne pour mes applications Angular. Elle inclut les modifications apportées à la configuration d'index.html et de nginx:

index.html

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

nginx.conf

location / {
  try_files $uri $uri/ /index.html;
}

location ~ \.html$ {
  add_header Cache-Control "private, no-cache, no-store, must-revalidate";
  add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT";
  add_header Pragma no-cache;
}

Fonctionne à la fois lorsque l'utilisateur accède à "site.com" et à "site.com/some/url" ou à "site.com/#/login".[.____.unset.Les modifications" index.html "doivent être sur le coffre-fort. côté principalement.

1
Denys Vuika