Указывает ли обязательный повторный валидатор заголовка cache-control браузеру загружать кэшированный файл, только если он изменился? - PullRequest
1 голос
/ 07 октября 2019

Если я хочу, чтобы браузеры загружали файлы PDF из кэша до тех пор, пока они не изменились на сервере, нужно ли использовать max-age=0 и must-revalidate в качестве заголовков для управления кэшем?

Если бы я использовал другое значение (больше 0) для max-age, это означало бы, что повторная проверка произойдет только после того, как будет превышено значение максимального возраста?

Что произойдет, если я будуустановить только заголовок must-revalidate без максимального возраста?

Я читал этот вопрос , и я не уверен на 100%.

Кроме того, что именно подтверждаетзначит? Означает ли это, что клиент спрашивает сервер, изменился ли файл?

Напротив, я читал, что отсутствие кэширования с контролем кэша в значительной степени делает то, чего я хочу достичь. Кэшируйте и проверяйте на сервере, есть ли новая версия ... так какой же правильный путь?

1 Ответ

1 голос
/ 11 октября 2019

Я предполагаю, что вы спрашиваете, какие заголовки вы должны настроить для отправки с вашего сервера, а под "клиентом" вы подразумеваете "современный веб-браузер"? Тогда цитируемый вопрос / ответ правильный, поэтому:

  1. Да, вы должны установить оба, но достаточно max-age=0, (must-revalidate - поведение по умолчанию)
  2. ДаПравильно, ответ будет передаваться из локального кэша до истечения максимального срока, после чего он будет повторно проверен (один раз), затем снова отправлен из локального кэша и т. д.
  3. Это не определено и отличаетсямежду браузерами и способом отправки запроса (нажав на ссылку из html, нажав кнопку перезагрузки, набрав прямо в адресной строке и нажав ввод). Как правило, ответ не следует обслуживать непосредственно из кэша, но его можно либо просто повторно подтвердить, либо запросить полный ответ у сервера.
  4. Повторное подтверждение означает, что клиент запрашивает сервер на отправку содержимого, только если оно было изменено с момента его изменения. последний раз был найденДля того чтобы это работало, в ответ на первоначальный запрос сервер отправит один или оба из:
    • Etag заголовка (который содержит хэшированное значение содержимого), который клиент будет кэшировать и отправлять обратно при повторной проверкезапросите заголовок If-None-Match, чтобы сервер мог сравнивать кэшированное значение Etag клиентов с текущим Etag на стороне сервера. Если значение не изменилось, сервер ответит 304 Not Modified (и пустым телом), а если значение изменилось, сервер ответит 200 и полным (новым) содержимым
    • Last-Modified (чтосодержит метку времени последней модификации контента), и клиент отправит ее в запросе на повторную проверку в заголовке If-Modified-Since, который будет использоваться на стороне сервера для уточнения ответа (304 или 200)

Cache-control: no-cache может достичь того же эффекта в большинстве (простых) случаев. Ситуация усложняется, когда между клиентом и сервером существует промежуточных кэшей , или когда вы хотите настроить поведение клиента (например, при отправке запросов AJAX), и это когдабольшинство директив кэширования вступают в действие

...