0

为什么有时我将图像(或 CSS、JS 等)发送到 FTP,但它们没有上传(或被缓存)?

#container {
    background: url("../images/bg.jpg") no-repeat scroll 0 0 transparent;
    height: 895px;
    overflow: hidden;
}

但是使用//( ../images//bg.jpg),我可以看到新图像

#container {
    background: url("../images//bg.jpg") no-repeat scroll 0 0 transparent;
    height: 895px;
    overflow: hidden;
}
4

1 回答 1

1

似乎文件已上传,但已被浏览器缓存。

尝试在 Firefox/IE 中使用 CTRL+F5 重新加载(其他浏览器可能有不同的快捷方式),您应该始终看到新文件。

资源(JS、CSS 和图像文件)以某种方式更积极地被浏览器缓存。而对于 HTML 页面,一般每次刷新都会有一个新的 HTTP 请求,而对于资源,有时根本不会产生 HTTP 请求。您可以通过查看例如 Firebug 的网络面板来看到它。

缓存通常是一个非常棘手的话题,很大程度上取决于服务器和浏览器的设置和实现。

浏览器缓存通常通过精确的 URL 匹配来实现。所以,http://someserver/bg.jpghttp://someserver//bg.jpg是两个完全不同的URL。但是,许多 HTTP 服务器会假定您请求了相同的内容,并将发送存储在您的服务器根文件夹中的 bg.jpg 文件的内容(您必须看到 URL 和与此 URL 链接的内容之间的区别)。

如果您访问了第一个 URL,它将被浏览器缓存。然后,在您上传新版本的图像后,很大程度上取决于浏览器对缓存的实现,以及您第一次下载“bg.jpg”时发送的服务器缓存设置。例如,在带有图像的 HTTP 响应标头中发送的服务器设置可能是,在接下来的 1 小时内,图像可能会被浏览器缓存,并直接从缓存中加载,甚至无需询问服务器(服务器设置可能以这种方式配置以避免不必要的流量)。

始终获取“新”版本文件的(有点笨拙,但非常常用)的方法是向请求添加当前时间戳(但通常仅限于服务器端生成或 JavaScript 脚本中)-在 CSS 中没有多大意义。

所以,在我写它的时候,脚本会询问服务器, http://someserver/bg.jpg?1334442703 但几秒钟后,当我刷新页面时,它将是 http://someserver/bg.jpg?1334442711

大多数服务器会丢弃查询字符串('?' 之后的字符串),并且只会bg.jpg为两个查询返回相同的文件内容,但由于图像的 URL 不同,因此任何浏览器都不应该从缓存中读取图像。

于 2012-04-14T21:34:07.037 回答