2010-02-03 106 views
2

好吧,我很困惑。我试图从我的服务器发回魔术标题,这将阻止客户端再次点击服务器,直到资源过时。防止HTTP客户端击中具有缓存的服务器(iphone)

我了解ETag或Last-Modified如何工作(验证) - 客户端总是仍然会打到服务器,并且服务器需要根据当前值验证日期或etag以知道是否打扰提供新服务。

缓存控制和过期,但是,我不认为我理解。我设置如下:

Cache-Control: max-age=86400, must-revalidate 

不管我做什么,我的客户(我的浏览器,卷曲,NSURLConnection的)总是再打服务器上的第二个请求。这是客户端吗?我应该发回什么标题让客户端在特定时间段内使用它的私有缓存?

回答

2

正如Nathan在他的回答中所暗示的,客户可以使用If-Modified-Since标题发出后续请求,以确定其缓存是否陈旧。如果客户端收到304 Not Modified响应,它会将内容提供给本地缓存。

根据RFC 2616(HTTP 1.1规范),在Cache-control标头内存在must-revalidate强制客户端在服务于缓存之前重新检查其与发起服务器的缓存状态。

+0

第一段 - 如果客户端收到304未修改,它是否会避免打一段时间的服务器? 第二 - 这并不符合我读过的内容。 “必须重新验证”意味着客户无论如何都必须遵循“您的规则”。 – 2010-02-03 23:22:56

+0

噢,是的 - '必须重新验证'不是你想要的。 – Nathan 2010-02-03 23:23:32

1

服务器需要检查If-Modified-Since标题并返回304 not modified标题,如果它希望浏览器保持缓存。

+0

我理解的ETag如何工作。我想让客户端避免检查服务器。显然,验证并不能帮助我做到这一点。也许我完全误解了其他类型的? – 2010-02-03 23:16:05

+0

嗯。大约一年前我做了这件事,让我查看细节。 – Nathan 2010-02-03 23:18:34

+0

我的PHP代码中的相关行告诉浏览器不要再回来24小时: '$ this-> getResponse() - > setHttpHeader(“Cache-Control”,“max-age =”。(60 * 60 * 24),true);' – Nathan 2010-02-03 23:21:42

相关问题