我们使用 Nginx 在开发平台上提供静态文件。由于它是一个开发平台,我们希望禁用缓存,以便每个更改都传播到服务器。VHost 的配置非常简单:
server {
server_name static.server.local;
root /var/www/static;
## Default location
location / {
access_log off;
expires 0;
add_header Cache-Control private;
}
}
当我们访问 HTML 文件时(http://static.server.local/test.html),我们没有问题:服务器返回一个代码304 未修改只要文件没有被改变,200 正常当文件更改时,它会对修改后的文件做出响应。
但是,对于 Javascript 或 CSS 文件,它似乎表现不同。一旦文件更改,我们就会得到200 正常响应与预期一致,但文本内容较旧。Nginx
中是否存在内部缓存机制可以解释此行为?或者我们应该添加一些配置?
附注一下,这是文件被修改时 Nginx 返回的标头(似乎是正确的):
Accept-Ranges:bytes
Cache-Control:max-age=0
private
Connection:keep-alive
Content-Length:309
Content-Type:text/css
Date:Fri, 13 May 2011 14:13:13 GMT
Expires:Fri, 13 May 2011 14:13:13 GMT
Last-Modified:Fri, 13 May 2011 14:13:05 GMT
Server:nginx/0.8.54
编辑expires
在尝试了指令和标头 的不同设置后Cache-Control
,我做了进一步的调查。实际上,服务器安装在 VirtualBox 客户机 Ubuntu 上,数据从 Mac OSX 主机上的共享文件夹读取。
如果从主机上的 IDE(NetBeans)编辑文件,似乎不会出现更改,而如果我直接在客户机上编辑它(使用 VIM),它会刷新。
奇怪的是它对 HTML 文件的行为并不相似。
相当令人费解。
编辑2(答案)
事实上,问题的根源更多在于 VirtualBox 方面。或者更确切地说,是 VirtualBox 与服务器的“sendfile”选项之间的冲突。
此链接VirtualBox 讨厌 Sendfile给了我解决方案:切换发送文件服务器配置中的标志离开:
sendfile off;
希望这也能帮助其他使用 VirtualBox 进行开发的人。:)
有关VirtualBox 论坛。
答案1
由于答案以某种方式隐藏在问题中 - 这里是针对 VirtualBox 环境中 nginx 的解决方案作为独立答案。
在您的 nginx 配置(通常为 /etc/nginx/nginx.conf)或 vhost 配置文件中将sendfile
参数更改为off
:
sendfile off;
虽然sendfile
这是 Nginx 声誉的核心(超快的低级静态文件服务效率),但它可能是本地开发的祸根,例如经常更改且需要重新加载的 Javascript。尽管如此,Nginx sendfile 很智能,可能不是大多数人的问题;也请检查浏览器的“禁用缓存”选项!
答案2
将你的过期标签设置为
expires off;
并且它根本不应该设置任何过期标头,也可能是您的浏览器错误地缓存了文件
答案3
虽然已经很晚了,但仍然标记为未答复,所以我会尝试一下。只是为了开个玩笑,你试过吗:
location ~* \.(css|js)$ {
expires 0;
break;
}
我自己还没有尝试过这个,但是当我遇到类似的问题时,我已经学会在服务器容器中使用 Nginx 尝试这种事情......
答案4
如果上述内容均无帮助,而 Nginx 仍然返回文件的旧内容,则可能与有关的问题open_file_cache
。
请参阅参考: