繁体   English   中英

ETag标头不返回304

[英]ETag header does not return 304

我目前正在使用REST API。 我想检查HTTP缓存是否正常工作,但不幸的是我根本不工作。 无论我做什么,它总是返回HTTP代码200,而它应该从我所知道的返回304。

这是我的PHP代码:

public function getList()
{
    $this->addHeaders(array(
        'Cache-Control' => 'public, must-revalidate, max-age=120',
        'eTag' => 'xyz123',
    ));

    $array = array(
        'foo' => 'bar',
        'nested' => array(
            'lorem' => 'ipsum',
            'dolor' => 'sit amet'
        )
    );

    $this->addHeader('Content-Length', strlen(json_encode($array, true)));

    return new JsonModel($array);
}

响应/请求

在此输入图像描述

ETag不会更改,因此除了第一个请求之外的请求应该从缓存中提供。 我错了吗?

我正在关注这两篇文章:

我还检查了弱验证器 - Last-Modified但我遇到了同样的问题。 浏览器在Request中发送正确的标头,但我仍然得到200响应

ETag要求服务器发回304响应,以便从Cache中触发加载。

在基于时间的缓存中:

  1. 客户端发出初始请求,将响应缓存一段确定的时间
  2. 在后续请求中,如果资源位于缓存中,则使用它而不联系该资源的服务器

在基于ETag的缓存中:

  1. 客户端发出初始请求,将响应缓存到服务器的ETag以及该资源的ETag
  2. 在后续请求中,如果资源在高速缓存中,则ETag作为If-None-Match字段包含在对服务器的新请求中。
  3. 服务器检查If-None-Match标头,如果它与服务器上的内容匹配,则发送未修改的304,指示客户端缓存使用它的本地副本。 如果ETag不同,则服务器正常返回资源。

要使代码正常工作,您需要检查PHP中是否存在If-None-Match标头:

If(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == 'xyz123') {
    header("HTTP/1.1 304 Not Modified");
    exit();
}

您的客户端正在发送Cache-Control标头,其值为max-age=0 这向服务器指示客户端请求新的响应,并且服务器发送HTTP 200状态代码。

客户端发送的Cache-Control标头通常是在浏览器中使用开发人员工具而不禁用“禁用缓存”选项的结果。

看起来您没有实现任何用于检查eTag标头的逻辑。 这不可能自动发生,因为服务器不理解业务逻辑,因此无法确定何时使缓存无效。

还有另一个答案,它描述了最小化设置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM