好吧,我几乎要放弃这个了,但是我怎么才能禁用Nginx对JavaScript文件的缓存呢?我使用的是一个带有Nginx的Docker容器。当我现在在JavaScript文件中更改一些内容时,我需要多次重新加载,直到新文件出现。
我怎么知道它是Nginx而不是浏览器/Docker?
浏览器:我在命令行上使用curl
来模拟请求,也遇到了同样的问题。另外,我使用的是CacheKiller
插件,并在Chrome开发工具中禁用了缓存。
Docker:当我连接到容器的bash,并在更改文件后使用cat
时,我立即得到了正确的结果。
我将我的nginx.conf
的sites-enabled
更改为这个(我在另一个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;
}
但是,在重新构建容器(并确保它位于cat
的容器中)之后,它仍然不起作用。
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;
}
6条答案
按热度按时间hmtdttj41#
我有以下nginx虚拟主机(静态内容)用于本地开发工作,以禁用所有浏览器缓存:
未发送缓存标头:
Last-Modified
始终为当前时间。注意:nginx的
$date_gmt
不符合HTTP规范(see changing the format)。要禁用特定文件扩展名的缓存(例如OP请求的JS):
请参阅下面Nitai的回答,以扩展文件扩展名列表-使用非捕获组正则表达式模式。
wko9yo5t2#
expires
和add_header
指令对NGINX缓存文件没有任何影响,它们纯粹是关于浏览器看到的内容。您可能需要的是:
虽然通常.js等是你会缓存的东西,所以也许你应该完全禁用缓存?
omqzjyyz3#
您需要的是一个简单的指令,例如:
以上操作不会缓存()中的扩展名。您可以为不同的文件类型配置不同的指令。
7gs2gvoe4#
记住设置
sendfile off;
或缓存头不起作用。我使用这个代码片段:k0pti3hp5#
我有以下Nginx虚拟主机(静态内容)用于本地开发工作,以禁用所有浏览器缓存:
fjnneemd6#
我知道这个问题有点老了,但是我建议在javascript的url中使用一些cachebraking散列,这在生产和开发过程中都能完美地工作,因为你可以同时拥有无限的缓存时间和即时更新。
假设您有一个javascript文件**/js/script.min.js**,但在引用的html/php文件中,您没有使用实际路径,而是:
所以每次文件被修改,浏览器都会得到一个不同的url,这意味着它不能被缓存,无论是本地的还是中间的代理。
为了实现这个功能,你需要nginx把任何对/js/script.[0-9a-f]{32}.min.js的请求重写成原来的文件名。在我的例子中,我使用了下面的指令(css也一样):
我猜filemtime调用甚至不需要访问服务器上的磁盘,因为它应该在linux的文件缓存中,如果你有疑问或静态html文件,你也可以使用一个固定的随机值(或增量或内容哈希),当你的javascript / css预处理器完成时,它会被更新,或让你的git钩子之一改变它。
理论上,您也可以使用一个cachebreaker作为伪参数(如/js/script.min.js?cachebreak= 0123456789 abcfef),但由于“?",文件至少不会被某些代理缓存。