2013-11-15 4 views
2

Я пытаюсь сказать 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; 

Я потерял. Это противоречит всему, что я считал правильным. Пожалуйста помоги.

ответ

6

Вы должны изменить свои сети, так как они дают вам неправильные советы.

Просто удалите все 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

+0

Спасибо, что работает с одним исключением: когда актив является 'touch'ed кэш разорен. Я не хочу, чтобы кеш был разорен. Возможно ли заставить Nginx игнорировать/перезаписывать «mtime» обслуживаемых активов? – krukid

+0

Дело в моей настройке на веб-сайте заключается в том, что я развертываю на нескольких серверах и синхронизирую «mtime» при каждом развертывании, потому что мой старый подход, основанный на кэшировании, основывался на «mtime». Теперь я пытаюсь перейти к отладке кеша на основе отпечатков пальцев, но будет переходный период, когда оба подхода должны работать, поэтому мне нужно синхронизировать «mtime's _and_» и использовать отпечатки пальцев без перебора кеша. – krukid

+0

В любом случае, прямо сейчас я рассматриваю исключение новых активов из синхронизации «mtime», но я думал, что FS 'mtime' может только перехватить кеш через HTTP-заголовок« Last-Modified »и перезаписать его с правилом Nginx, должно было устранить проблему , – krukid

-1

кажется часть моей конфигурации. Во время моего исследования я понял, что браузер использует эвристический анализ для проверки запросов с заголовками ConditionalGet (E-Tag, Last-Modified). Это имеет большое значение для обратных ответов, поэтому вы можете справиться с этим, чтобы сохранить ресурсы сервера.

Но с точки зрения статических файлов (js, css, images) вы можете сообщить браузеру, что они будут обслуживать их сразу же без каких-либо Условных Получить подтверждение. Это полезно, если вы обновляете имя файла, если происходят какие-либо изменения.

Эта часть конфигурации делает это произошло:

add_header Cache-Control public; 
add_header Last-Modified ""; 
add_header ETag ""; 
Смежные вопросы