Настройка закінчує термін дії заголовків статичного вмісту, що подається з nginx


96

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

Відповіді:


126

Я вважаю за краще робити більш повний заголовок кешу, крім деяких додаткових розширень файлів. "?" префікс - позначка "незахоплення", 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 роки, але для майбутніх громадян)
ауларон

1
Я особисто ціную роз'яснення, особливо для майбутніх пошукових працівників, оскільки вони часто з’являються довго після оригіналу публікації. +1: P
Дж. М. Бекер

Використовуючи це, повністю псує мій веб-сайт Wordpress. css та зображення не відображаються. чи є десь інший конфлікт?
користувач1641443


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

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
Я б використовував кореневу директиву лише в блоці сервера {}, коли використання її в підрозділах призводить до несподіваних наслідків. Вам не потрібна перерва; або, оскільки ви не знаходитесь у блоці 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 epoch) призводить до того, що ресурс завжди переробляється, maxвстановлює дату для максимального значення браузера.

~ Зображення / відповідає будь-яким типам зображень.

Більше про nginx карти можна знайти на веб-сайті http://nginx.org/en/docs/http/ngx_http_map_module.html .


Зверніть увагу , що якщо $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 не знайти жодного з моїх статичних файлів. Не дуже впевнений, чому, але це проста альтернатива.


Я проголосував за це, але переконайтеся, що ви додали /staticпапку (усе, що ви встановили в місці) в кінці псевдоніма (відразу після .../filesв прикладі).
Міро Дж.

-1

Оскільки це дуже стара тема, і я знайшов сучасний дивовижний підручник.

Можливо, ви хочете це перевірити

Як реалізувати кешування браузера з заголовком модуля Nginx на Ubuntu 16.04


1
Як правило, ми нахмуримось на посилання на статті, але не включаючи до них і зміст, оскільки посилання мають тенденцію змінюватися або закінчуватися.
Unkwntech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.