在阅读了这里的许多文章和一些问题后,我终于成功激活了 Apache mod_expires
,告诉浏览器它必须缓存图像 1 年。
<filesMatch "\.(ico|gif|jpg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</filesMatch>
幸运的是,服务器响应似乎是正确的:
HTTP/1.1 200 OK
Date: Fri, 06 Apr 2012 19:25:30 GMT
Server: Apache
Last-Modified: Tue, 26 Jul 2011 18:50:14 GMT
Accept-Ranges: bytes
Content-Length: 24884
Cache-Control: max-age=31536000, public
Expires: Sat, 06 Apr 2013 19:25:30 GMT
Connection: close
Content-Type: image/jpeg
好吧,我认为这会阻止浏览器下载,甚至会在 1 年内向服务器查询图像。但这部分是正确的:因为如果您关闭并重新打开浏览器,浏览器将不再从服务器下载图像,但浏览器仍会向服务器查询每个图像的 HTTP 请求。
如何强制浏览器停止对每个图像发出 HTTP 请求?即使这些 HTTP 请求后面没有下载图像,它们仍然是向服务器发出的请求,这会不必要地增加延迟并减慢页面呈现速度!
我已经告诉浏览器它必须将图像缓存 1 年!为什么浏览器仍然会向服务器查询每个图像(即使它没有下载图像)?!
查看 FireBug 中的网络图(菜单 FireBug > Net > Images)我可以看到不同的缓存行为(我显然从浏览器缓存完全为空开始,我使用“清除所有历史记录”强制在浏览器上删除缓存):
当页面第一次加载时,所有图像都被下载(如果我通过单击浏览器的重新加载页面按钮强制重新加载页面,也会发生同样的事情)。这是有道理的!
当我浏览网站并返回同一页面时,根本没有下载图像,浏览器甚至不会向服务器查询任何图像。这是有道理的,(我想在浏览器关闭时也看到这种行为)!
当我关闭浏览器并在同一页面上再次打开它时,愚蠢的浏览器无论如何都会对每个图像向服务器发出一次 HTTP 请求:它不会下载图像,但它仍然发出 HTTP 请求,就像浏览器查询关于图像的服务器(服务器回复 200 OK)。这是让我恼火的一个!
如果您有兴趣,我还附上下面的图表:
编辑:刚刚也使用 FireFox 11.0 进行了测试,以确保这不是我的 FireFox 3.6 太旧的问题。同样的事情发生!!!我还测试了 Google 站点和 Stackoverflow 站点,它们都发送了,Cache-Control: max-age=...
但是一旦浏览器关闭并在同一页面上再次打开,浏览器仍然会为每个图像向服务器发出 HTTP 请求,服务器响应后浏览器不会下载图像(正如我上面解释的那样),但它仍然发出增加查看页面时间的该死请求。
EDIT2:并按照此处Last-Modified
的建议删除标题,并不能解决问题,也没有任何区别。