首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解如果-修改-自HTTP报头

理解如果-修改-自HTTP报头
EN

Stack Overflow用户
提问于 2011-02-22 17:09:52
回答 2查看 41.2K关注 0票数 15

我正在查看一个缓存库,它试图使用请求对象的If-Modified-Since头。问题是这个标题永远不会被设置,它总是空白的,这对我来说是有意义的,因为它是一个请求。

如何强制请求具有If-Modified-Since头?还是我对这件事的看法太离谱了。

这是我指的功能。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2011-02-22 17:21:26

只有当客户端已经获得了一个资源,并且响应具有一个If-Modified-Since头和一个允许浏览器缓存(如包含publicCache-Control和/或Pragma值)的标题的响应时,使用Cache-Control的请求才有意义。

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

另请参阅:

  • 网页作者和网站管理员的缓存教程
票数 25
EN

Stack Overflow用户

发布于 2011-02-22 22:05:06

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

尝试设置以下字段:

代码语言:javascript
复制
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
  • 需要Last-Modified作为验证器(如果要测试If-Modified-Since,请不要发送If-Modified-Since)。
  • Expires -1告诉您,资源已陈旧,必须始终重新验证。
  • Cache-Control不能包含无缓存或无存储。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5081397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档