Заголовок 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 не изменяется, поэтому запросы, кроме первого, должны обслуживаться из кэша. Я ошибся?

Я следил за этими 2 статьями:

Я также проверил с слабый валидатор— Последнее изменение, но у меня та же проблема. Браузер отправляет правильный заголовок в Запрос, но я все еще получаю 200 в ответ

5

Решение

ETag требует, чтобы сервер отправил ответ 304 назад, чтобы инициировать загрузку из кэша.

В кеше на основе времени:

  1. Клиент делает первоначальный запрос, кэширует ответ в течение определенного времени
  2. В последующих запросах, если ресурс находится в кеше, он используется без обращения к серверу за этим ресурсом.

В кеше на основе ETag:

  1. Клиент делает начальный запрос, кэширует ответ в течение определенного времени вместе с ETag с сервера для этого ресурса.
  2. В последующих запросах, если ресурс находится в кэше, ETag включается в новый запрос к серверу как поле If-None-Match.
  3. Сервер проверяет заголовок If-None-Match и, если он совпадает с содержимым на сервере, отправляет 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();
}
5

Другие решения

Ваш клиент отправляет Cache-Control заголовок со значением max-age=0, Это указывает серверу, что клиент запрашивает новый ответ, и сервер отправляет код состояния HTTP 200.

Cache-Control Заголовок, отправляемый клиентом, обычно является результатом использования инструментов разработчика в браузере и не отключения опции «Отключить кэширование».

1

Похоже, вы не реализовали никакой логики для проверки заголовков eTag. Это не может произойти автоматически, потому что сервер не понимает бизнес-логику и, следовательно, не может определить, когда пришло время аннулировать кэш.

Есть еще один ответ, который описывает минимальная настройка.

0
По вопросам рекламы [email protected]