Должен ли 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 ответа:
теоретически вам не нужно отправлять Cache-Control для 304-получатель должен просто продолжать использовать директивы кэша, которые он получил от исходного 200. Однако, как вы обнаружили, на практике, если вы не продолжаете отправлять Cache-Control, браузеры будут игнорировать директивы кэша, которые вы отправили изначально, и вернуться к своей собственной эвристике по умолчанию.
Так что на практике, вы должны включить тот же кэш-контроль с 304, что и с 200. Только спецификация мандаты, что вы отправляете его на 304, если он отличается от того, что вы отправили ранее (см. 10.3.5 304 Не Изменено) - но это, конечно, не запрещает вам повторять его, когда это то же самое.
и ответить конкретно на неверные точки из другого ответа (структуры):
вы do хотите, чтобы промежуточные кэши кэшировали ответ (то есть обновляли свою запись в кэше для ресурса). Они будут реагировать соответственно к запросам от клиентов с 200 или 304, в зависимости от того, включил ли клиент условный заголовок, такой как If-Modified-Since.
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-адреса в свою адресную строку (или если у вас нет пользовательского приложения, которое каким-то образом управляет этой функциональностью).
отредактировал первый абзац, чтобы прочитать немного лучше(надеюсь)