Я хочу, чтобы браузеры проверяли 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. Но я понятия не имею, что не так и как заставить его работать должным образом.