15

我正在查看一个尝试使用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;
}
4

2 回答 2

25

仅当客户端已经拥有一个资源时,请求If-Modified-Since才有意义,该资源与一个响应一起获得,该响应具有一个Last-Modified标头与允许浏览器缓存的标头,例如一个Cache-Control和/或Pragma包含public.

此外,我注意到某些浏览器不包括If-Modified-Since原始响应还包含ETag标头时。浏览器将改为使用If-None-Match它来测试它。

也可以看看:

于 2011-02-22T17:21:26.873 回答
11

首先,您必须确保首先缓存初始响应(我在另一个相关问题中回答了这个问题。

尝试设置以下字段:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • Last-ModifiedETag需要作为验证器(如果您想测试,请不要发送If-Modified-Since
  • Expires -1告诉资源是陈旧的,必须始终重新验证
  • Cache-Control不得包括 no-cache 或 no-store

当您在初始响应中发送这些标头时HTTP/200,在后续请求中,浏览器应发送包含If-Modified-Since标头的条件请求。

于 2011-02-22T22:05:06.900 回答