了解 If-Modified-Since HTTP 标头
Posted
技术标签:
【中文标题】了解 If-Modified-Since HTTP 标头【英文标题】:Understand If-Modified-Since HTTP Header 【发布时间】:2011-07-02 04:05:33 【问题描述】:我正在查看一个尝试使用请求对象的 If-Modified-Since
标头的缓存库。问题是这个标题永远不会被设置,它总是空白的,这对我来说是一个请求是有意义的。
如何强制请求具有If-Modified-Since
标头?还是说我对它的作用不满意。
这是我所指的函数。
public function isNotModified(Request $request)
$lastModified = $request->headers->get('If-Modified-Since');
$notModified = false;
if ($etags = $request->getEtags())
$notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);
elseif ($lastModified)
$notModified = $lastModified == $this->headers->get('Last-Modified');
if ($notModified)
$this->setNotModified();
return $notModified;
【问题讨论】:
如何强制请求拥有anything? 【参考方案1】:带有If-Modified-Since
的请求只有在客户端已经拥有一个资源时才有意义,该资源与具有Last-Modified
标头的响应以及允许浏览器缓存的标头(如Cache-Control
和/或@)结合使用987654324@ 值包含public
。
另外,我注意到一些浏览器不包含If-Modified-Since
,而原始响应还包含ETag
标头。浏览器将改为使用If-None-Match
对其进行测试。
另见:
Caching tutorial for web authors and web masters【讨论】:
@symc: 与一些旧代理结合使用仍然非常有效。我无法理解如何提及这可能会对 OP 的具体问题产生负面影响 :) 度过了糟糕的一天?【参考方案2】:首先,您必须确保首先缓存初始响应(我在另一个相关问题中answeredthis。
尝试设置以下字段:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
需要Last-Modified
作为验证器(如果您想测试If-Modified-Since
,请不要发送ETag
)
Expires -1
表示资源已过时,必须始终重新验证
Cache-Control
不得包含 no-cache 或 no-store
当您在初始 HTTP/200
响应中发送这些标头时,在后续请求中,浏览器应发送包含 If-Modified-Since
标头的条件请求。
【讨论】:
如果我总是想处理“内容”怎么办?有没有办法获取“缓存”数据?以上是关于了解 If-Modified-Since HTTP 标头的主要内容,如果未能解决你的问题,请参考以下文章
在“If-Modified-Since”HTTP 标头中使用客户端生成的时间
如何在 http 请求中传递“If-Modified-Since”?