我对所有这些缓存内容感到很困惑。我正在尝试设置以减少从我的网站到服务器的mod_expires
次数。HTTP Requests
到目前为止我做得很好,我mod_expires
按照说明安装并编写了一个小的 .conf 文件http://httpd.apache.org/docs/2.0/mod/mod_expires.html。
现在,例如,我的所有.png, .gif, .jpeg
文件都有一个Cache-Control
标头。我预期的结果是,浏览器不会GET Request
在时间段内执行任何操作(根据Cache-Control
值给出)。但事实确实如此,每个文件都会触发请求并接收HTTP 304 not Modified
。
这不是错误的行为吗?它应该从内部缓存中加载该文件。我不明白的是,浏览器发送了一个Response header
: Cache-Control: max-age=0
。应该这样吗?
Request + Response headers
以下是单个的完整示例.png file
:
要求
Host dev-mgg.localdomain
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Referer http://dev-mgg.localdomain/css/global/icons.css?18224
Cookie IR_SQLPwdStore=; IR_SQLUser=sysadm
If-Modified-Since Thu, 24 Jul 2008 06:24:11 GMT
If-None-Match "4010127-3c4-452bf1aefd8c0"
Cache-Control max-age=0
回复
Date Mon, 02 Aug 2010 14:00:28 GMT
Server Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch mod_perl/2.0.4 Perl/v5.10.0
Connection Keep-Alive
Keep-Alive timeout=15, max=59
Etag "4010127-3c4-452bf1aefd8c0"
Expires Mon, 02 Aug 2010 14:04:28 GMT
Cache-Control max-age=240
答案1
欢迎来到精彩的网络世界(服务器|浏览器)!
网络浏览器最终如何表现,几乎取决于网络浏览器。有些浏览器根本不会请求已缓存的图像,有些则会。有些浏览器只有在调整为隐私浏览或类似功能时才会请求它们。
如果您有一个动态网页,即使浏览器之前已被告知不需要返回来获取图像,您的浏览器也很可能仍会尝试加载静态图像。在这种情况下,浏览器将尝试请求图像,服务器将响应 304 Not Modified。
但不用担心,这是浏览器唯一能得到的响应。该特定请求不会传输更多数据,因此从资源角度来看,这是一件非常轻松的事情。
有时,如果你从不同的域名提供图像会有所帮助(例如,静态.yourdomain.com代替www.您的域名.com),但请放心,浏览器就像终结者 2,它们会比你想象的更快回归。简单的 Ctrl+F5 或 Ctrl+Shift+R 就足以强制你的典型浏览器刷新所有内容。
(如果我错了,请纠正我。)
答案2
您在服务器中使用 mod_expires 设置的参数Cache-Control max-age=240
对于测试来说有点低,它告诉浏览器仅将内容保留在缓存中 4 分钟(240 秒)。
因此,您可以做的第一件事就是将该值增加到更长的时间(例如一周),以便您无需运行即可进行测试。
#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 week"
Header append Cache-Control "public"
</filesMatch>
无论如何,您的测试是在点击浏览器重新加载页面按钮后执行的。一旦您这样做,浏览器就会向服务器发送请求,Cache-Control max-age=0
告诉服务器再次将整个资源归还给它。您应该通过强制页面重新加载来测试缓存是否有效,而不要通过以下方式:
通过导航到另一个网站,然后返回测试页面。
或者您可以关闭浏览器然后在同一页面上再次打开它。
执行我上面列出的测试,您应该看到浏览器不再请求相同的资源,因为服务器告诉浏览器它必须将资源保存在缓存中并将其从缓存中取出一周。