了解If-Modified-Since HTTP Header

时间:2011-02-22 17:09:53

标签: php http cache-control outputcache if-modified-since

我正在寻找一个试图使用请求对象的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;
}

2 个答案:

答案 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标头的条件请求。