Не удалось на неопределенный срок кэшировать ответ HTTP через Nginx.
-
20-12-2019 - |
Вопрос
Я пытаюсь сказать nginx кэшировать некоторые из моих ресурсов (js, css) навсегда или, по крайней мере, на очень долгое время.
Идея состоит в том, что как только пакет ресурсов скомпилирован и опубликован с /assets/
Префикс URI (например. /assets/foo-{fingerprint}.js
) он остается там и его никогда не нужно менять.
Интернет подсказал мне, что я должен написать следующее правило:
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
break;
}
Я ожидал, что это приведет к ответам с HTTP-кодом 304 «Не изменено», но я каждый раз получаю последовательный HTTP 200 (ОК).
Я пробовал некоторые другие подходы, например:
а) явная установка времени модификации на постоянный момент времени в прошлом;
add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
б) переключение на If-None-Match
чеки;
add_header ETag $1;
if_modified_since off;
Однако единственное, что действительно сработало так, как нужно, это:
add_header Last-Modified "Thu, 01 Jan 2030 00:00:00 GMT";
if_modified_since before;
Я заблудился.Это противоречит всему, что я считал правильным.Пожалуйста помоги.
Решение
Вам следует изменить свои интернеты, поскольку они дают вам неверные советы.
Просто удалите все add_header
линии из вашего местоположения (а также излишки brake
):
location ~ ^/assets/.*-([^.]+)\.(js|css)$ {
gzip_static on; # there's also a .gz of the asset
expires max;
}
и прочитайте документацию из настоящего Интернета: http://nginx.org/r/expires и http://tools.ietf.org/html/rfc2616
Другие советы
Кажется, это часть моей конфигурации.В ходе исследования я понял, что браузер использует эвристический анализ для проверки запросов с заголовками ConditionalGet (E-Tag, Last-Modified).Это имеет большой смысл для внутренних ответов, поэтому вы можете справиться с этим, чтобы сэкономить ресурсы сервера.
Но что касается статических файлов (js, css, изображений), вы можете указать браузеру сразу обслуживать их без какой-либо проверки условного получения.Будет полезно обновить имя файла в случае каких-либо изменений.
Эта часть конфигурации делает это возможным:
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";