2016-11-08 6 views
5

Я работаю в настоящее время на REST API. Я хотел проверить, работает ли HTTP-кеш, но, к сожалению, я вообще не работаю. Независимо от того, что я делаю, он всегда возвращает HTTP-код 200, в то время как он должен возвращать 304 из того, что я знаю.Заголовок ETag не возвращается 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); 
} 

ответ/Запрос

enter image description here

ETag не меняется, поэтому запросы, кроме первого должны обслуживаться из кэша. Я ошибаюсь?

Я следовал эти 2 статьи:

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

+1

Как вы настроили обработку eTag? Существует [ответ, который описывает минимальную настройку] (http://stackoverflow.com/a/13197481/199048). –

+1

Если я не ошибаюсь, не несет ответственности за реализацию вашего сервера, чтобы проверить, отличается ли представленный etag от текущего на вашем сервере? В этом случае ваш код должен будет ответить «304». – rmoestl

+1

Я вижу, что вы используете Apache 2.4. Возможно, вы столкнулись с проблемой, описанной здесь: http://stackoverflow.com/questions/896974/apache-is-not-sending-304-response-if-mod-deflate-and-addoutputfilterbytype-is – tcurvelo

ответ

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(); 
} 
0

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

Существует еще один ответ, в котором описывается minimal setup.

1

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

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