Не удалось на неопределенный срок кэшировать ответ HTTP через Nginx.

StackOverflow https://stackoverflow.com//questions/20009029

Вопрос

Я пытаюсь сказать 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 "";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top