php – ETag标题不返回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不会更改,因此除了第一个请求之外的请求应该从缓存中提供.我错了吗?
我正在关注这两篇文章:
> https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
> https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=en
我还检查了弱验证器 – Last-Modified但我遇到了同样的问题.浏览器在Request中发送正确的标头,但我仍然得到200响应
最佳答案:
ETag要求服务器发回304响应,以便从Cache中触发加载.
在基于时间的缓存中:
>客户端发出初始请求,将响应缓存一段确定的时间
>在后续请求中,如果资源位于缓存中,则使用它而不联系该资源的服务器
在基于ETag的缓存中:
>客户端发出初始请求,从服务器为该资源缓存响应一段确定的时间以及ETag
>在后续请求中,如果资源位于缓存中,则ETag将作为If-None-Match字段包含在对服务器的新请求中.
>服务器检查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();
}
标签:php,http,http-headers,http-status-codes,http-caching 来源: https://codeday.me/bug/20190516/1114701.html