Установка заголовков expires для статического контента, обслуживаемого из nginx
Я использую nginx для сервера моего статического контента, есть ли способ, которым я могу установить заголовки expires для каждого файла, который соответствует определенному правилу? Например, я могу установить заголовок expires для всех файлов с расширением.css?
8 ответов
Я предпочитаю делать более полный заголовок кэша, в дополнение к некоторым другим расширениям файлов. '?' префикс - это отметка "не захватывать", 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 - безопасную и обучающую, поэтому мне приходится делать определенные блоки местоположения в директиве сервера моего сайта, выделяя эти папки.
Поэтому у меня нет глобального корневого каталога.
Поэтому, когда вы создаете свои блоки местоположения изображений, вы, возможно, не предоставляете им корневой каталог, из которого можно искать изображения!
Мое решение было тогда:
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;
}
Все вышеупомянутые решения будут лишать возможности иметь разные псевдонимы для разных путей. Также для того, чтобы все ваши истечения срока действия кэша были в одном месте, вы должны использовать 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.
Вы также можете установить срок действия до максимума. Вот директива, которую я использую для CSS и JS.
# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
access_log off;
expires max;
}
Если у вас есть одно место, где хранятся все ваши статические файлы, что-то вроде этого подойдет...
location /static {
your/location/to/static/files/static;
expires 30d;
add_header Cache-Control "public";
}
Принятый ответ заставил nginx не найти ни одного из моих статических файлов. Не совсем уверен, почему, но это простая альтернатива.
Большинство ответов на этой странице чрезвычайно устарели и/или запутаны...
Начнем с того, что заголовок в наши дни не является хорошим вариантом, равно как иPragma
заголовок... в идеале вам следует отключить оба этих заголовка в вашей конфигурации Nginx .
more_clear_headers "Pragma Expires";
Гораздо проще установить один заголовок в блоке местоположения статических ресурсов:
location ~* \.(atom|bmp|bz2|css|doc|docx|eot|gif|gz|ico|jpeg|jpg|js|mid|midi|mp4|ogg|ogv|otf|png|ppt|rar|rss|rtf|svg|svgz|tar|tgz|ttc|ttf|wav|webp|woff|woff2|xls|zip)$ {
add_header Cache-Control "public, max-age=691200";
}
Помните, что для Nginx, если вы используетеexpires
директива, такая какexpires max
это НЕ просто установка HTTPExpires
заголовок, он также устанавливает заголовок, поэтому он может довольно быстро запутаться.
TLDR просто используйтеCache-Control
в ваших статических файлах, чтобы CDN, такие как Cloudflare, могли кэшировать их на периферии и/или браузеры могли кэшировать их на некоторое время.
И я рекомендую НЕ использовать какие-либо заголовки кэша для вашей страницы/HTML-содержимого на динамических сайтах, таких как WordPress, потому что это приведет только к конфликтам и путанице... если вы действительно этого хотите, вы можете просто использоватьetag
для ваших страниц, но лично я этого не делаю и думаю, что это имеет больше смысла при использовании агрессивных кэшей вывода, таких как Varnish или LS Cache от Litespeed.
Описанные выше подходы мы используем в SlickStack , и они отлично работают с точки зрения производительности и стабильности, а также защищают от, например, плагинов WordPress (или людей), которые могут испортить ваши настройки.
Так как это очень старая тема, и я нашел современный удивительный учебник.
Возможно, вы хотите проверить это
Как реализовать кэширование в браузере с помощью модуля заголовка Nginx в Ubuntu 16.04