HTTP资源caching/抓取

我试图优化一个页面,我看到一些奇怪的行为。 每次我点击一个链接到页面,所有资源都从服务器获取,响应200。 但是,当我刷新页面(特别是Firefox中的F5 )时,所有的资源都会返回一个304,当然,页面的加载速度会更快。

主页面在两种情况下返回200。 在刷新的情况下, If-Modified-Since头与请求一起被发送到资源。 但是,在“点击链接”的情况下,他们不是。 这是什么原因,我能控制它吗?

为了确定这种行为发生的原因,请尝试使用FF插件LiveHTTPHeaders或Firebug来查看您的服务器响应主体是什么 – 更具体地说,它们是如何允许浏览器进行caching的。 如果没有这些信息,我很难说出为什么你会得到这种行为。 但是,是的,有几个方法可以控制它。

如果您知道资源不会改变,您可以明确告诉浏览器将对象caching一段固定的时间。 一个优秀的黑客,就是说caching多年 – 然后只是稍微改变url强制刷新(例如http://.../images/test.jpg?1 ,用http://.../images/test.jpg?1等replace1 )。 一些框架通过附加上次修改的时间戳自动完成。

1).htaccess电子标签(来自http://stuntsnippets.com/etags-htaccess/

 FileETag MTime Size <ifmodule mod_expires.c> <filesmatch "\.(jpg|gif|png|css|js)$"> ExpiresActive on ExpiresDefault "access plus 1 year" </filesmatch> </ifmodule> 

完整的文档: http : //httpd.apache.org/docs/2.0/mod/core.html

2).htaccesscaching控制(从http://www.askapache.com/htaccess/apache-speed-cache-control.html

 # 480 weeks <filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=290304000, public" </filesMatch> # 2 DAYS <filesMatch "\.(xml|txt)$"> Header set Cache-Control "max-age=172800, public, must-revalidate" </filesMatch> # 2 HOURS <filesMatch "\.(html|htm)$"> Header set Cache-Control "max-age=7200, must-revalidate" </filesMatch> 

完整的文档: http : //httpd.apache.org/docs/2.0/mod/mod_expires.html

为什么发生这种情况

行为可能是浏览器caching,但混淆是由于如何显示响应。 这是一个很大的假设,整个答案取决于,所以如果这是不正确的,请原谅我。

我发现Chrome浏览器(点击f12,“networking”标签)在说明这个比Firefox更好。

每次我点击一个链接到页面,所有资源都从服务器获取,响应200。

可能发生的事情是,当你“按照链接”(直接inputurl应该是相同的)时,你会看到200个响应,它们是真实请求和浏览器caching响应的混合。 这是正常的行为。 Chrome通过针对networking标签中的每个资源明确指出“来自caching”来说明“来自caching”的响应。 我相信FF在时间轴上将其作为灰色的回应。

在两个浏览器中,当从caching中检索项目时,它们仍然显示状态响应。 这是从最后一个服务器响应, 但这仍然是一个caching响应

但是,当我刷新页面(特别是Firefox中的F5)时,所有的资源都会返回一个304,当然,页面的加载速度会更快。

当你点击F5时,你强制发送一个请求,而不是完全忽略caching,但是在服务器再次检查是否改变了。 您的请求标头包含If-Modified-Since因为它仍然可以从caching中获得。 将返回一个304,并且浏览器使用caching的版本确信服务器版本没有更改。

关联链接 =使用caching数据。

F5 =再次发送请求。

Ctrl + F5 =再次发送请求,但也忽略本地caching。

主页面在两种情况下返回200。

浏览器caching可能被禁用的主页(也许所有.html内容默认情况下)的方式返回的响应头。 因为这个原因,它不能在刷新的请求中发送一个If-Modified-Since ,因为它不在caching本地存在,所以没有date去比较内容。 由于在请求中没有发送If-Modified-Since ,所以服务器必须以全页内容响应另外200个。

在刷新的情况下,If-Modified-Since头与请求一起被发送到资源。

由于资源项目可从caching中获取,因此需要发送date – 项目添加到浏览器caching的date。

但是,在“点击链接”的情况下,他们不是。 这是什么原因,我能控制它吗?

因为浏览器在从本地caching中检索时不会发送If-Modified-Since标头。 200“响应”是一个caching的。 你不需要这样控制。

这些都不能解释为什么当你点击F5时它的加载速度更快。 你肯定这是正确的?

另外请注意浏览器的“启发式caching”。 这是浏览器在caching不是由响应头明确定义时所采用的行为,本质上是“最佳猜测”行为。 每个浏览器自然不同。

这听起来像是一个浏览器设置给我,通过在我的(Windows 7)上网本的Firefox浏览器中看到的选项,我看不到任何东西,可以让你控制它。

所以我认为这是一个不好的,恐怕。

如果您在两种情况下都包含了请求和响应头的示例,那将会很有帮助。

显式刷新会导致浏览器在请求中包含prama:no-cache – 这意味着所有中间caching(包括代理)都必须将请求转发到原始服务器。 当您点击链接时,内容可能来自您的浏览器caching,中间代理,反向代理或原始服务器。

所有的资源都会返回一个304,当然 – 页面加载的速度要快得多

但是,如果您使用允许te浏览器caching的指令(即expires或cache-control:max-age指令)提供内容,则会得到更快的响应。 有条件的请求只能在处理非常大的文件(PDF,video等)时真正加速访问。 请注意,当从本地caching中获取时,大多数浏览器都会报告这种操作的200状态 – 但是这比返回原点要快得多。

在刷新的情况下,If-Modified-Since头与请求一起被发送到资源。 但是,在“点击链接”的情况下,他们不是

真? 你确定?

如果你没有包含任何max-age / expirescaching指令,这可能会发生 – 这是一个愚蠢的事情,我从来没有testing过它的行为。