Должен ли HTTP 304 не изменяться-ответы содержат заголовки управления кэшем?


Я пытался понять это, и искал так для подобных вопросов, но у меня все еще нет 100% понимания того, как это должно работать.

Я получаю этот ответ на запрос ресурса изображения:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

желаемое поведение заключается в том, что клиент должен кэшировать это в течение 120 секунд, а затем запросить его с сервера снова. В течение 120 секунд запрос на сервер не отправляется.

затем, через 120 секунд, отправляется запрос и a 304 получен ответ:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

пока все хорошо. Но тогда, на следующий запрос (whithin 120 секунд) я бы подумал, что ресурс должен быть кэширован в течение 120 новых секунд. С другой стороны, я вижу в браузере (Firefox), что он с этого момента всегда запрашивает ресурс и получает 304-ответ.

Я должен прикрепить заголовки cache-control в 304-response? Из того, что я могу прочитать в спецификации, похоже, что кэш-контроль настройки должны быть опущены, и что кэш должен кэшировать его в течение 120 новых секунд автоматически?

3 54

3 ответа:

теоретически вам не нужно отправлять Cache-Control для 304-получатель должен просто продолжать использовать директивы кэша, которые он получил от исходного 200. Однако, как вы обнаружили, на практике, если вы не продолжаете отправлять Cache-Control, браузеры будут игнорировать директивы кэша, которые вы отправили изначально, и вернуться к своей собственной эвристике по умолчанию.

Так что на практике, вы должны включить тот же кэш-контроль с 304, что и с 200. Только спецификация мандаты, что вы отправляете его на 304, если он отличается от того, что вы отправили ранее (см. 10.3.5 304 Не Изменено) - но это, конечно, не запрещает вам повторять его, когда это то же самое.

и ответить конкретно на неверные точки из другого ответа (структуры):

  1. вы do хотите, чтобы промежуточные кэши кэшировали ответ (то есть обновляли свою запись в кэше для ресурса). Они будут реагировать соответственно к запросам от клиентов с 200 или 304, в зависимости от того, включил ли клиент условный заголовок, такой как If-Modified-Since.

  2. 120-секундный ttl будет быть обновлен 304 (так что тот же клиент не должен делать другой запрос на тот же ресурс в течение по крайней мере еще 120 секунд). И клиенты, пока у них все еще есть содержимое в кэше,будет продолжайте делать условные запросы для ресурса, что вы можете продолжать реагировать с 304.

RFC7232 обновления RFC2616, чтобы сказать:

сервер, генерирующий ответ 304, должен генерировать любой из следующие поля заголовка, которые были бы отправлены в 200 (ОК) ответ на тот же запрос: Cache-Control, Content-Location, Date, ETag, истекает и изменяется.

Если я правильно понимаю, то браузер на самом деле кэширует в течение 120 секунд, и ваш сервер отвечает на 304 не измененные последующие запросы If-Modified-Since. Этот запрос " IMS " возникает, когда конечный пользователь обращается к тому же URL. В это время браузер может отправить запрос If-Modified-Since. Браузер хочет знать, если он отображает устаревшее содержимое. Это кажется нормальным.

при получении этого запроса ваш сервер должен ответить 200 OK, 304 Not Modified (или 4XX, если необходимый.)

Я не считаю, что вы должны настроить свой сервер для отправки заголовка Cache-Control с ответом 304 по двум причинам:
1. Вы не хотите, чтобы какие-либо промежуточные кэши кэшировали этот ответ 304 (есть вероятность, что они могут)
2. 120-секундный TTL не будет обновлен ответом 304. Браузер сохранит объект в течение 120 секунд от ответа 200 OK. Через 120 секунд браузер должны отправить запрос GET, а не If-Modified-Since, поэтому ваш сервер будет отвечать байтами файла, а не только ответом 304.

обратите внимание, что браузер не будет запрашивать файл автоматически через 120 секунд, если конечный пользователь специально не запросит его через загрузку страницы или непосредственно ввод URL-адреса в свою адресную строку (или если у вас нет пользовательского приложения, которое каким-то образом управляет этой функциональностью).

отредактировал первый абзац, чтобы прочитать немного лучше(надеюсь)