Я использую 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";
}
У меня недостаточно репутации, чтобы прокомментировать, почему принятый ответ приведет к тому, что файлы больше не будут отображаться, но я понял это и хотел бы помочь!
Укороченная версия:
Убедитесь, что у вас есть корневой каталог, указанный для вашего блока местоположения на изображениях, если у вас нет глобального каталога!
Полная версия ниже:
Во-первых, мой метод реализации этого решения был действительно похож на этот ответ, где вы пишете правило (как в принятом ответе):
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