disable - Deshabilitar la memoria caché nginx para archivos JavaScript
nginx force refresh cache (5)
Ok, casi estoy renunciando a esto, pero ¿cómo puedo desactivar el almacenamiento en caché de Nginx para archivos JavaScript? Estoy usando un contenedor docker con Nginx. Cuando ahora cambio algo en el archivo JavaScript, necesito varias recargas hasta que el nuevo archivo esté allí.
¿Cómo sé que es Nginx y no el navegador / docker?
Navegador: usé curl
en la línea de comandos para simular la solicitud y tuve los mismos problemas. Además, estoy usando un complemento de CacheKiller
y tengo la memoria caché deshabilitada en Chrome Dev Tools.
Docker: cuando me conecto al bash del contenedor y uso cat
después de cambiar el archivo, obtengo el resultado correcto de inmediato.
Cambié mi nginx.conf
para los sites-enabled
para esto (que encontré en otro hilo de stackoverflow)
location ~* ^.+/.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|xml|html|htm)$ {
# clear all access_log directives for the current level
access_log off;
add_header Cache-Control no-cache;
# set the Expires header to 31 December 2037 23:59:59 GMT, and the Cache-Control max-age to 10 years
expires 1s;
}
Sin embargo, después de reconstruir los contenedores (y asegurarse de que está en el contenedor con cat
), todavía no funcionó. Esto aquí es el completo .conf
server {
server_name app;
root /var/www/app/web;
# Redirect to blog
location ~* ^/blog {
proxy_set_header Accept-Encoding "";
sub_filter ''https://testproject.wordpress.com/'' ''/blog/'';
sub_filter_once off;
rewrite ^/blog/(.*) /$1 break;
rewrite ^/blog / break;
proxy_pass https://testproject.wordpress.com;
}
# Serve index.html only for exact root URL
location / {
try_files $uri /app_dev.php$is_args$args;
}
location ~ ^/(app|app_dev|config)/.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+/.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app_dev.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
location ~* ^.+/.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|xml|html|htm)$ {
# clear all access_log directives for the current level
access_log off;
add_header Cache-Control no-cache;
# set the Expires header to 31 December 2037 23:59:59 GMT, and the Cache-Control max-age to 10 years
expires 1s;
}
error_log /var/log/nginx/app_error.log;
access_log /var/log/nginx/app_access.log;
}
Las directivas expires
y add_header
no tienen ningún impacto en que NGINX almacene en caché los archivos, solo se trata de lo que ve el navegador.
Lo que probablemente quieras en su lugar es:
location stuffyoudontwanttocache {
# don''t cache it
proxy_no_cache 1;
# even if cached, don''t try to use it
proxy_cache_bypass 1;
}
Aunque, por lo general, .js, etc., es lo que se almacenaría en la memoria caché, ¿quizás debería simplemente deshabilitar el almacenamiento en caché por completo?
Lo que estás buscando es una directiva simple como:
location ~* /.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
Lo anterior no almacenará en caché las extensiones dentro de (). Puede configurar diferentes directivas para diferentes tipos de archivos.
Recuerde sendfile off;
o los encabezados de caché no funcionan. Yo uso este recortado
location / {
index index.php index.html index.htm;
try_files $uri $uri/ =404; #.s. el /index.html para html5Mode de angular
#.s. kill cache. use in dev
sendfile off;
add_header Last-Modified $date_gmt;
add_header Cache-Control ''no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'';
if_modified_since off;
expires off;
etag off;
proxy_no_cache 1;
proxy_cache_bypass 1;
}
Tengo el siguiente host virtual Nginx (contenido estático) para el trabajo de desarrollo local para deshabilitar todo el almacenamiento en caché del navegador:
upstream testCom
{
server localhost:1338;
}
server
{
listen 80;
server_name <your ip or domain>;
location / {
# proxy_cache datacache;
proxy_cache_key $scheme$host$request_method$request_uri;
proxy_cache_valid 200 60m;
proxy_cache_min_uses 1;
proxy_cache_use_stale updating;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_ignore_headers Set-Cookie;
userid on;
userid_name __uid;
userid_domain <your ip or domain>;
userid_path /;
userid_expires max;
userid_p3p ''policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"'';
add_header Last-Modified $date_gmt;
add_header Cache-Control ''no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'';
if_modified_since off;
expires off;
etag off;
proxy_pass http://testCom;
}
}
Tengo el siguiente host virtual nginx (contenido estático) para el trabajo de desarrollo local para deshabilitar todo el almacenamiento en caché del navegador:
server {
listen 8080;
server_name localhost;
location / {
root /your/site/public;
index index.html;
# kill cache
add_header Last-Modified $date_gmt;
add_header Cache-Control ''no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'';
if_modified_since off;
expires off;
etag off;
}
}
No se han enviado encabezados de caché:
$ curl -I http://localhost:8080
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Mon, 24 Jul 2017 16:19:30 GMT
Content-Type: text/html
Content-Length: 2076
Connection: keep-alive
Last-Modified: Monday, 24-Jul-2017 16:19:30 GMT
Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0
Accept-Ranges: bytes
Last-Modified
es siempre la hora actual.