Задание истечения срока действия заголовков для статического содержимого, предоставляемого из nginx

96

Я использую nginx для сервера моего статического контента, есть ли способ, которым я могу установить заголовки expires для каждого файла, который соответствует определенному правилу? Например, я могу установить заголовок expires для всех файлов с расширением .css?

Unkwntech
источник

Ответы:

127

Я предпочитаю делать более полный заголовок кэша, в дополнение к некоторым другим расширениям файлов. '?' префикс - это отметка «не захватывать», nginx не создаст $ 1. Это помогает уменьшить ненужную нагрузку.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
Дж. М. Беккер
источник
7
Все мои статические файлы не были найдены после добавления этого.
Юрген Павел
@JackSpairow: Я не могу объяснить, почему это произошло, потому что это всегда работало для меня. Вы работаете в Nginx, где отсутствует модуль предоставления add_header? Такие вещи действительно ограничены по объему, вы уверены, что другое замедление не является проблемой в комбинации?
Дж. М. Беккер
24
Возможно, у другого блока есть определение для статических файлов с rootнабором, в этом случае вы должны добавить директивы к этому блоку. (Я знаю, что это 2 года поздно, но для будущих граждан)
Aularon
1
Я лично ценю разъяснения, особенно для будущих поисковиков, потому что они часто появляются намного позже оригинального сообщения. +1: P
JM Becker
использование этого полностью портит мой сайт WordPress. CSS и изображения не показывают. есть ли где-нибудь еще конфликт?
user1641443
17

У меня недостаточно репутации, чтобы комментировать, почему принятый ответ может привести к тому, что файлы больше не будут отображаться, но я понял это и хотел бы помочь!

Укороченная версия:

Убедитесь, что у вас есть корневой каталог для вашего блока местоположения на изображениях, если у вас нет глобального набора!

Длинная версия ниже:


Прежде всего, мой метод реализации этого решения был действительно похож на этот ответ , где вы пишете правило (как в принятом ответе):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

в файл img-cache.conf

и затем включите этот файл в вашу server {...}директиву.

Мой пример somesite.com в моей папке сайтов, доступных:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

Таким образом, вы можете добавить блок местоположения кэширования изображений для нескольких сайтов, которые вы можете запустить.


Во-вторых, у меня есть ситуация, когда мой / var / www / содержит две папки, которые я разрешаю как public_html - безопасную и обучающую, поэтому мне нужно сделать определенные блоки местоположения в директиве сервера моего сайта, выделяя эти папки.

Поэтому у меня нет глобального корневого каталога .

Поэтому, когда вы создаете свои блоки местоположения изображений, вы, возможно, не предоставляете им корневой каталог, из которого можно искать изображения!

Мое решение было тогда:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}
amurrell
источник
1
+1 для того, чтобы сделать это многоразовым .conf. Соответствующая папка , в , nginx/1.14.0 (Ubuntu)кажется /etc/nginx/snippets/.
Ян Верховен
9

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

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Джодер Хо
источник
1
Я бы использовал корневую директиву только в блоке server {}, когда он используется во вложенных местах, это приводит к неожиданным последствиям. Вам не нужен перерыв; либо, поскольку вы не находитесь в блоке if {}
Дейв Чейни
Ты прав. Забыл убрать это. Отредактировано, чтобы отразить это.
Jauder Ho
4

Все вышеупомянутые решения будут лишать возможности иметь разные псевдонимы для разных путей. Также для того, чтобы все ваши истечения срока действия кэша были в одном месте, вы должны использовать nginx map следующим образом.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offотключает кэширование, epoch(для эпохи Unix) приводит к тому, что ресурс всегда обновляется, maxустанавливает дату в максимальное значение браузера.

Изображение ~ соответствует любым типам изображений.

Подробнее о картах nginx можно узнать на сайте http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
источник
Обратите внимание , что если $sent_http_content_typeесть "text/css;charset=UTF-8"приведенное выше выражение потерпит неудачу.
пачанка
2

Если у вас есть одно место, где хранятся все ваши статические файлы, что-то вроде этого подойдет ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

Принятый ответ заставил nginx не найти ни одного из моих статических файлов. Не совсем уверен, почему, но это простая альтернатива.

user161646
источник
Я проголосовал за этот, но убедитесь, что вы добавили /staticпапку (что бы вы ни указали в месте) в конце псевдонима (сразу после .../filesв примере).
Миро Дж.
-1

Так как это очень старая тема, и я нашел современный удивительный учебник.

Возможно, вы хотите проверить это

Как реализовать кэширование в браузере с помощью модуля заголовка Nginx в Ubuntu 16.04

Мохаммад Каусара
источник
1
Как правило, мы не одобряем ссылки на статьи и не включая их содержимое, так как ссылки имеют тенденцию изменяться или истекать.
Unkwntech