【问题标题】:How to detect whether web page content is different from cached version如何检测网页内容是否与缓存版本不同
【发布时间】:2011-04-19 20:04:31
【问题描述】:

大家好 如您所知,检查网页内容的过程与我们机器上的静态页面或个人文件略有不同,因为动态网页的内容在每次请求时都会更改。因此,如果我们要使用校验和来识别更改,我们将失败!非常简单的例子是网站所有者在他的网站上使用 Google Ads;每个请求的广告都与以前不同。此外,如果我们只在一段时间内缓存,我们也会失败,因为有些网页不是每年更新一次,但有些是每分钟更新一次(如果不是几秒的话)。

那么有什么更好的方法来解决这个问题? (谢谢)

更新

另一个选项是使用 LastModified http-header!但这是一种强有力的方法吗?

【问题讨论】:

标签: caching http-headers webpage


【解决方案1】:

浏览器在 HTTP 提供的几种缓存机制的帮助下自动执行此操作。 Entity TagsLast Modified HTTP 标头的概念对于确定页面是否已更改最明显有用的两种机制。 这些机制允许浏览器向网站发出有条件的请求,例如。仅在页面已更改时才获取该页面。

在 HTTP 1.1 上引用 RFC 2616

3.11 实体标签

实体标签用于比较来自同一实体的两个或多个实体 请求的资源。 HTTP/1.1 在 ETag (section 14.19)、If-Match(第 14.24 节)、If-None-Match(第 14.26 节)和 If-Range(第 14.27 节)标题字段。他们如何定义 被使用和比较,因为 缓存验证器 在第 13.3.3 节中。一个 实体标签由一个不透明的带引号的字符串组成,可能前缀为 弱点指标。

这里的关键是ETag 是一个缓存验证器。如果浏览器有一个页面的缓存版本(在 RFC 中称为 resource),它可以使用 ETag 来确定缓存的页面是否仍然有效,即。如果页面在服务器上没有改变。

关于修改日期:

14.25 If-Modified-Since

If-Modified-Since 请求头字段与一种方法一起使用 使其有条件:如果请求的变体没有被修改 自此字段中指定的时间起,实体将不会 从服务器返回;相反,304(未修改)响应将 不带任何消息体返回。

这里的关键是服务器可能知道页面何时被修改,然后可以通知客户端。

如果您打开 HTTP 监视器(例如 Windows 版 Fiddler)并观察浏览器与网站的通信,您将在浏览器发出条件请求时亲眼看到这些机制的使用。

为了专门解决您关于 Last Modified 标头的问题,此标头本身不适用于您会发现的大多数页面。但结合 ETag 它可以帮助您入门。

【讨论】:

  • 您的描述很简单,但非常有用!再次感谢;)
  • @Sadegh 如果您还有其他问题,请告诉我们。
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多