Назад | Перейти на главную страницу

Установка истекает заголовки для статического контента, обслуживаемого из nginx

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

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

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

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

В location директива

В expires директива

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

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

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

Полная версия ниже:


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

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 - secure и training, поэтому мне нужно сделать определенные блоки местоположения в директиве сервера моего сайта, выделяя эти папки.

В качестве таких, У меня нет глобального корневого каталога.

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

Мое решение заключалось в следующем:

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;
}

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

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

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

...

# 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 устанавливает дату на максимальное значение браузера.

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

Подробнее о картах nginx на http://nginx.org/en/docs/http/ngx_http_map_module.html.

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

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

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

Шаг 1: Настройка заголовков Cache-Control и Expires:

sudo nano /etc/nginx/sites-available/default

Добавьте следующее выше server блок:

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

И эта линия внутри server блок. expires $expires;

sudo systemctl restart nginx

Источник: DigitalOcean