了解 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,请不要发送ETagExpires -1 表示资源已过时,必须始终重新验证 Cache-Control 不得包含 no-cache 或 no-store

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

【讨论】:

如果我总是想处理“内容”怎么办?有没有办法获取“缓存”数据?

以上是关于了解 If-Modified-Since HTTP 标头的主要内容,如果未能解决你的问题,请参考以下文章

HTTP的请求头标签 If-Modified-Since

在“If-Modified-Since”HTTP 标头中使用客户端生成的时间

如何在 http 请求中传递“If-Modified-Since”?

HTTP协议中GET请求方法中的请求头内容 : If-Modified-Since

HTTP的请求头标签 If-Modified-Since

HTTP 缓存 - 与服务器检查,始终发送 If-Modified-Since