我目前正在使用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但我遇到了同样的问题。浏览器在请求中发送正确的标头,但我仍然得到200响应
答案 0 :(得分:5)
ETag要求服务器发回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();
}
答案 1 :(得分:1)
您的客户端正在发送Cache-Control
标头,其值为max-age=0
。这向服务器指示客户端请求新的响应,并且服务器发送HTTP 200状态代码。
客户端发送的Cache-Control
标头通常是在浏览器中使用开发人员工具而不是禁用“禁用缓存”选项的结果。
答案 2 :(得分:0)
看起来您没有实现任何检查eTag标头的逻辑。这不可能自动发生,因为服务器无法理解业务逻辑,因此无法确定何时使缓存无效。
还有另一个答案,它描述了minimal setup。