我真的很困惑,所有的caching的东西。 我试图设置mod_expires来减less从我的网站到服务器的HTTP Requests的数量。
到目前为止,我做得很好,我安装了mod_expires并从http://httpd.apache.org/docs/2.0/mod/mod_expires.html上的说明中写了一个.conf文件。
现在,例如,我所有的.png, .gif, .jpeg文件都有一个Cache-Control头。 我的预期结果是,浏览器将不会在这段时间内(从Cache-Control值给出)执行任何GET Request 。 但是,每个单个文件都会触发一个请求,并收到HTTP 304 not Modified 。
那是错误的行为是不是? 它应该从内部caching中加载这些文件。 有一件事我不明白的是,浏览器发送一个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
并欢迎到web(服务器|浏览器)的美好世界!
Web浏览器如何最终performance出来,几乎取决于Web浏览器。 一些浏览器根本不会请求已经caching的图像,有些会。 有些人只有在进行隐私浏览或类似的调整时才会要求他们。
如果你有一个dynamic的网页,很可能你的浏览器仍然会尝试加载静态图像,即使浏览器早就被告知它不需要返回图像。 在这些情况下,浏览器将尝试请求一个图像,服务器将回应304未修改。
但不用担心,这是您的浏览器将回来的唯一的回应。 没有更多的数据传输的特定请求,所以从资源的angular度来看,这是一件非常轻的事情。
有时候,如果你从不同的域名(比如说static.yourdomain.com,而不是http://www.yourdomain.com )提供图片,这会有所帮助,但是放心,浏览器就像Terminator 2,他们会比你想象的更快。 一个简单的Ctrl + F5或Ctrl + Shift + R就足以强制你的浏览器刷新所有的东西。
(如果我错了,请纠正我)
使用mod_expires在服务器中设置的Cache-Control max-age=240对testing有点低,它告诉浏览器只保留4分钟(240秒)的内容。
所以你能做的第一件事就是把这样的价值增加到更长的一个星期,所以你可以做testing而不运行。
#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>
无论如何,你的testing是在你点击浏览器页面button后进行的。 一旦你做了那个浏览器发送一个请求与Cache-Control max-age=0告诉服务器再次把它归还整个资源。 你应该testingcaching是否工作,而不是通过强制一个页面的relaod,但只是:
通过导航到另一个网站,然后回到testing页面。
或者,您可以closures浏览器,然后再在同一页面上打开它。
做上面列出的testing,你应该看到浏览器不再要求相同的respurce,因为服务器告诉浏览器它必须保持资源caching,并从那里拿出1周。