好的,我几乎放弃了这个,但是如何禁用Nginx对JavaScript文件的缓存?我正在使用Nginx的docker容器。当我现在在JavaScript文件中更改某些内容时,我需要多次重新加载,直到新文件存在。
我怎么知道它是Nginx而不是浏览器/泊坞窗?
浏览器:我在命令行上使用了curl
来模拟请求并遇到了同样的问题。此外,我正在使用CacheKiller
插件并在Chrome开发工具中禁用缓存。
Docker:当我连接到容器的bash,并在更改文件后使用cat
时,我会立即得到正确的结果。
我将nginx.conf
的{{1}}更改为此(我在另一个stackoverflow线程中找到)
sites-enabled
然而,在重建容器(并确保它在容器中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
.conf
答案 0 :(得分:52)
我有以下nginx虚拟主机(静态内容)用于本地开发工作以禁用所有浏览器缓存:
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;
}
}
没有发送缓存标头:
$ 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
始终是当前时间。
答案 1 :(得分:18)
expires
和add_header
指令对NGINX缓存文件没有影响,这些只是浏览器看到的内容。
您可能需要的是:
location stuffyoudontwanttocache {
# don't cache it
proxy_no_cache 1;
# even if cached, don't try to use it
proxy_cache_bypass 1;
}
虽然通常.js等是你要缓存的东西,所以也许你应该完全禁用缓存?
答案 2 :(得分:7)
您正在寻找的是一个简单的指令,如:
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
以上内容不会缓存()中的扩展名。您可以为不同的文件类型配置不同的指令。
答案 3 :(得分:2)
请记住设置.as-console-wrapper { top: 0; max-height: 100% !important;}
或缓存标头不起作用。
我用这个剪断了:
sendfile off;
答案 4 :(得分:2)
我有以下Nginx虚拟主机(静态内容)用于本地开发工作以禁用所有浏览器缓存:
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;
}
}
答案 5 :(得分:0)
我知道这个问题有点老了,但我建议在JavaScript的网址中使用一些cachebraking哈希。这在生产和开发过程中均能完美发挥作用,因为更改时您可以拥有无限的缓存时间和完整的更新。
假设您有一个javascript文件 /js/script.min.js , 但在引用html / php文件中,您不使用实际路径,而是:
<script src="/js/script.<?php echo md5(filemtime('/js/script.min.js')); ?>.min.js"></script>
因此,每次更改文件时,浏览器都会获得一个不同的url,这又意味着它无法缓存,无论是在本地还是在两者之间的任何代理上。
要执行此操作,您需要nginx将对/js/script.[0-9a-f]{32}.min.js的任何请求重写为原始文件名。就我而言,我使用以下指令(也适用于CSS):
location ~* \.(css|js)$ {
expires max;
add_header Pragma public;
etag off;
add_header Cache-Control "public";
add_header Last-Modified "";
rewrite "^/(.*)\/(style|script)\.min\.([\d\w]{32})\.(js|css)$" /$1/$2.min.$4 break;
}
我猜想filemtime调用甚至不需要在服务器上进行磁盘访问,因为它应该在linux的文件缓存中。如果您有疑问或静态html文件,还可以使用固定的随机值(或增量或内容哈希),该值会在javascript / css预处理器完成后更新,或者让您的git挂钩之一对其进行更改。
理论上,您也可以将cachebreaker用作虚拟参数(例如/js/script.min.js?cachebreak=0123456789abcfef),但是由于“ ?”。