Вопрос: Установка истекает для заголовков статического содержимого, поданных из nginx


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


84
2018-06-10 07:19


Источник




Ответы:


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

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

109
2017-11-25 21:07



Все мои статические файлы не были найдены после добавления этого. - Jürgen Paul
@JackSpairow: Я не могу объяснить, почему это произошло, поскольку это всегда сработало для меня. Вы используете Nginx без модуля добавления add_header? Этот вид действительно ограничен по объему, вы уверены, что другое замедление не является проблемой в сочетании? - TechZilla
Вероятно, еще один блок имел определение для статических файлов с root set, в этом случае вы должны добавить директивы к этому блоку. (Я знаю, что это уже два, но для будущих граждан) - aularon
Я лично ценю разъяснения, особенно для будущих поисковиков, потому что они часто появляются долго после первоначального поста. +1: P - TechZilla
используя это полностью испортил мой сайт WordPress. css и изображения не отображаются. есть ли где-нибудь другой конфликт? - user1641443


server {
    ...

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

location директива

expires директива


21
2018-06-10 07:23





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

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

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

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


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

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;

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


Во-вторых, у меня есть ситуация, когда my / 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;
}

10
2018-01-31 21:43





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

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

9
2018-06-10 08:41



Я бы использовал директиву root только в блоке server {}, при использовании его в подсекторах это приводит к неожиданным последствиям. Вам не нужен перерыв; либо, так как вы не находитесь в блоке if {} - Dave Cheney
Ты прав. Забыл очистить это. Отредактировано, чтобы отразить это. - Jauder Ho


Все вышеупомянутые решения отрицают возможность иметь разные псевдонимы для разных путей. Кроме того, ради того, чтобы все ваши кешированные выходы были в одном месте, вы должны использовать карту 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 устанавливает дату для максимального значения браузера.

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

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


2
2018-01-04 19:58



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


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

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

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


0
2018-02-25 03:12





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

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

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


-1
2018-05-04 04:18



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