Я пытаюсь сказать nginx кэшировать некоторые из моих активов (js, css) навсегда или, по крайней мере, в течение очень долгого времени.Неопределенное кэширование ответа HTTP через Nginx завершается
Идея состоит в том, что после того, как пакет активов скомпилирован и опубликован с префиксом URI /assets/
(например, /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 «Not Modified», но то, что я получаю является последовательной HTTP 200 (OK) каждый раз.
Я пробовал некоторые другие подходы, например:
а) явно устанавливая время изменения в постоянная момент времени в прошлом;
add_header Last-Modified "Thu, 01 Jan 1970 00:00:00 GMT";
b) переключение на 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;
Я потерял. Это противоречит всему, что я считал правильным. Пожалуйста помоги.
Спасибо, что работает с одним исключением: когда актив является 'touch'ed кэш разорен. Я не хочу, чтобы кеш был разорен. Возможно ли заставить Nginx игнорировать/перезаписывать «mtime» обслуживаемых активов? – krukid
Дело в моей настройке на веб-сайте заключается в том, что я развертываю на нескольких серверах и синхронизирую «mtime» при каждом развертывании, потому что мой старый подход, основанный на кэшировании, основывался на «mtime». Теперь я пытаюсь перейти к отладке кеша на основе отпечатков пальцев, но будет переходный период, когда оба подхода должны работать, поэтому мне нужно синхронизировать «mtime's _and_» и использовать отпечатки пальцев без перебора кеша. – krukid
В любом случае, прямо сейчас я рассматриваю исключение новых активов из синхронизации «mtime», но я думал, что FS 'mtime' может только перехватить кеш через HTTP-заголовок« Last-Modified »и перезаписать его с правилом Nginx, должно было устранить проблему , – krukid