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?
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;
}
location / {
try_files $uri $uri/ /index.html;
}
location = /index.html {
expires -1;
}
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.
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.