了解 If-Modified-Since HTTP 头部

16

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

如何强制一个 请求任何东西 - Raedwald
2个回答

26

10
@symc说:这种方法仍然非常适用,结合一些旧的代理服务器。但我不明白为什么提到这一点可能会对楼主的具体问题产生负面影响 :) 今天过得不好吗? - BalusC

12

首先,您必须确保最初的响应被缓存(我在另一个相关问题中进行了回答)。

尝试设置以下字段:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • 如果您想要测试 If-Modified-Since,则需要将 Last-Modified 作为验证器(不发送 ETag)。
  • Expires -1 表示资源已经过时,必须始终进行重新验证。
  • Cache-Control 的值不能包括 no-cache 和 no-store。

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


如果我总是想处理“content”,有没有一种方法可以获取“cached”数据? - Terry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接