我正在寻找一个试图使用请求对象的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;
}
答案 0 :(得分:24)
If-Modified-Since
的请求只有在客户端已经获得的资源以及具有Last-Modified
标头的响应以及允许浏览器缓存的响应(例如{{3)的情况下才有意义包含public
的/和Cache-Control
值。
此外,我注意到当原始响应还包含Pragma
标头时,某些浏览器不包含If-Modified-Since
。浏览器将使用ETag
来测试它。
答案 1 :(得分:11)
首先,您必须确保首先缓存初始响应(我answered这是另一个相关问题。
尝试设置以下字段:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
Last-Modified
需要作为验证者(如果您要测试ETag
,请不要发送If-Modified-Since
)Expires -1
表示资源已过时且必须始终重新验证Cache-Control
不得包含no-cache或no-store 当您在初始HTTP/200
响应中发送这些标头时,对于后续请求,浏览器应发送包含If-Modified-Since
标头的条件请求。