【发布时间】:2014-03-11 02:45:57
【问题描述】:
如果我的浏览器使用缓存(本地缓存),是否保证它发送的每个 HTTP 请求都包含“IF MODIFIED SINCE”标题行?
如果不是,我如何定义它会?如果我为浏览器定义代理服务器怎么办?那么它会自动添加它吗?
提前致谢
【问题讨论】:
标签: http
如果我的浏览器使用缓存(本地缓存),是否保证它发送的每个 HTTP 请求都包含“IF MODIFIED SINCE”标题行?
如果不是,我如何定义它会?如果我为浏览器定义代理服务器怎么办?那么它会自动添加它吗?
提前致谢
【问题讨论】:
标签: http
我刚刚使用我的 RESTful Web 服务处理此问题,并对特定资源进行了一些测试。首先,我试图通过在资源的 HTTP 响应上设置以下 HTTP 标头来控制我的 Web 服务器的浏览器缓存:
Cache-Control: must-revalidate, max-age=30
Last-Modified: Mon May 19 11:21:05 GMT 2014
Expires: Mon May 19 11:51:05 GMT 2014
然后,在我的 Web UI 中,我有一个计时器,它会定期(每 5 秒)对我所说的可缓存资源执行 GET。由于浏览器缓存中的资源尚未过期,因此资源的 GET 请求是从浏览器缓存中提供的,但是,一旦“max-age”过期,下一个 GET 请求就会发送到服务器,并且浏览器会添加“如果-Modified-Since”标头,其中“Last-Modified”日期作为值,如下所示:
[GET] - /cms_cm_web/api/notification
referer: http://localhost:8080/cms_ui/#/
accept: application/json, text/plain, */*
accept-language: en-us
ua-cpu: AMD64
accept-encoding: gzip, deflate
user-agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
host: localhost:8080
if-modified-since: Mon, May 19 11:21:05 GMT 2014
connection: Keep-Alive
这来自 IE9 浏览器。我从最新的 Firefox 和 Chrome 浏览器也得到了同样的结果。 从这里,服务器可以查找“If-Modified-Since”标头,如果它确定资源没有被修改,则返回 304 Not Modified 响应,否则,它返回具有 200 OK 响应的资源表示。
因此,根据 HTTP 规范,您可以使用“Expires”和/或“Cache-Control”标头以及“Last-Modified”标头来控制缓存。这将导致浏览器缓存执行所谓的“条件 GET”请求,因为它包含“If-Modified-Since”标头。
【讨论】: