Назад | Перейти на главную страницу

Как настроить заголовки кэширования HTTP для учета изменений файлов

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

По идее, подумал я, ETags созданы специально для этого.

На практике это не работает. По крайней мере, не так, как ожидалось.

простая конфигурация nginx

location ~* \.(js|jpg|png|css)$ {
  add_header Cache-Control "must-revalidate";
  etag on;
  break;
}

Проверка с curl, сообщает мне, что ETag изменяется при каждом изменении файла, а заголовки отправляются, как ожидалось.

HTTP/2 200 
server: nginx
date: Wed, 11 Sep 2019 08:08:10 GMT
content-type: text/css
content-length: 359249
last-modified: Wed, 11 Sep 2019 07:24:43 GMT
vary: Accept-Encoding
etag: "5d78a13b-57b51"
cache-control: must-revalidate
accept-ranges: bytes

Тестирование с curl и соответствующие заголовки if- *, nginx отправляет ответ 304

HTTP/2 304 
server: nginx
date: Wed, 11 Sep 2019 08:08:18 GMT
last-modified: Wed, 11 Sep 2019 07:24:43 GMT
etag: "5d78a13b-57b51"
cache-control: must-revalidate, max-age=0

При загрузке страницы в браузере Firefox и Chrome не запрашивают сервер и всегда используют кешированную версию файла. Независимо от того, меняю ли я содержимое или временную метку файла. :(

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

Возможно, я неправильно понял документацию о ETag или Cache-Control. Но я понятия не имею, что не так и как заставить его работать должным образом.