【发布时间】:2012-04-20 09:09:42
【问题描述】:
在阅读了这里的许多文章和一些问题后,我终于成功激活了 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)我可以看到不同的缓存行为(我显然从浏览器缓存完全为空开始,我使用“清除所有历史记录”强制在浏览器上删除缓存):
第一次加载页面时,所有图像都已下载(如果我通过单击浏览器的重新加载页面按钮强制重新加载页面,也会发生同样的事情)。 这是有道理的!
当我浏览网站并返回同一页面时根本没有下载图像,浏览器甚至不会向服务器查询任何内容的图像。 这是有道理的,(我希望在浏览器关闭时也能看到这种行为)!
1234563 HTTP请求,就像浏览器向服务器询问图片(服务器回复200 OK)。 这是让我恼火的一个!
如果您有兴趣,我还附上下面的图表:
编辑:刚刚也使用 FireFox 11.0 进行了测试,以确保这不是我的 FireFox 3.6 太旧的问题。同样的事情发生!!! 我还测试了 Google 网站和 Stackoverflow 网站,它们都发送了 Cache-Control: max-age=...,但是 一旦浏览器关闭并再次打开,浏览器仍然会为每个图像向服务器发出 HTTP 请求同一页面,在服务器响应后,浏览器不会下载图像(正如我上面解释的那样),但它仍然发出该死的请求,增加了查看页面的时间。
EDIT2:按照here 的建议删除Last-Modified 标头,并没有解决问题,也没有任何区别。
【问题讨论】:
-
如果可能更新,默认行为是下载?
-
@Tont Hopkinson:但我告诉浏览器
ExpiresDefault "access plus 1 year"(即Cache-Control: max-age=31536000)所以浏览器不应该再次访问服务器询问/寻找此类资源,我已经告诉他保留它缓存 1 年形成最后一次访问。 -
这就是为什么你所做的工作如你所愿是吗? Expires 是从浏览器缓存中删除的,不要不检查缓存是否更新一年......
-
@Tony Hopkinson:对不起,我没听懂你的意思。我希望浏览器不要下载图像,甚至不要再查询服务器 1 年。从我的测试来看,浏览器似乎没有再次下载图像,但它仍然查询服务器。我希望浏览器能够从自己的缓存中获取图像,并且在 1 年内不再访问服务器。
-
需要注意的是,无论设置了什么标头,当您刷新浏览器时都会发出实际的 http 请求。服务器仍会以 304 响应,并且不会有多少字节通过网络传输,但您仍然会遇到延迟问题。当跟随链接和导航时,浏览器本地缓存被命中(没有http请求)。只是调试时需要注意的事情。
标签: caching browser http-headers mod-expires