В настоящее время я работаю над 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 не изменяется, поэтому запросы, кроме первого, должны обслуживаться из кэша. Я ошибся?
Я следил за этими 2 статьями:
Я также проверил с слабый валидатор— Последнее изменение, но у меня та же проблема. Браузер отправляет правильный заголовок в Запрос, но я все еще получаю 200 в ответ
ETag требует, чтобы сервер отправил ответ 304 назад, чтобы инициировать загрузку из кэша.
В кеше на основе времени:
В кеше на основе ETag:
Чтобы ваш код работал, вам нужно проверить наличие If-None-Match
Заголовок в PHP:
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. Это не может произойти автоматически, потому что сервер не понимает бизнес-логику и, следовательно, не может определить, когда пришло время аннулировать кэш.
Есть еще один ответ, который описывает минимальная настройка.