(Django, Nginx) Запретить клиентским браузерам кэшировать статические файлы? - PullRequest
0 голосов
/ 19 февраля 2019

Мой сайт использует Django, Gunicorn и Ngnix.Я пытаюсь заставить клиентские браузеры, которые обращаются к моему веб-сайту, всегда получать последние статические файлы, не нажимая Ctrl + F5, чтобы очистить кэш браузера, чтобы получить новые статические файлы.

Я нашел во многихразмещает ответы, подобные следующим:

  1. Изменить файл /etc/ngnix/sites-enabled.
  2. $ Sudo Nano mysite.
  3. Добавьте следующий кодблок сервера.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires -1;
}

Единственное, что когда-либо происходит, это либо статические файлы вообще не загружаются, либо загружаются, но браузер все еще их кеширует, и их нужно вручнуюочищается ctrl + F5.

Как заставить браузеры каждый раз получать новые статические файлы?

1 Ответ

0 голосов
/ 19 февраля 2019

Попробуйте следующую конфигурацию nginx, чтобы инструктировать браузеры не кэшировать статические файлы.

location / {
  add_header Cache-Control "no-store, no-cache, private";
}

Согласно спецификации HTTP1.1

no-store

Цель директивы no-store - предотвратить непреднамеренный выпуск или сохранение конфиденциальной информации (например, на лентах резервных копий).Директива no-store применяется ко всему сообщению и МОЖЕТ быть отправлена ​​либо в ответе, либо в запросе.При отправке в запросе кеш НЕ ДОЛЖЕН хранить какую-либо часть этого запроса или любой ответ на него.При отправке в ответе кэш НЕ ДОЛЖЕН хранить какую-либо часть этого ответа или запроса, который его вызвал.Эта директива применяется как к не совместно используемым, так и совместно используемым кэшам.«НЕ ДОЛЖЕН хранить» в этом контексте означает, что кэш НЕ ДОЛЖЕН преднамеренно хранить информацию в энергонезависимом хранилище и ДОЛЖЕН приложить максимальные усилия для удаления информации из энергозависимого хранилища как можно быстрее после ее пересылки.Даже когда эта директива связана с ответом, пользователи могут явно хранить такой ответ вне системы кэширования (например, с помощью диалога «Сохранить как»).Буферы истории МОГУТ хранить такие ответы как часть их нормальной работы.

Цель этой директивы - удовлетворить заявленные требования определенных пользователей и авторов сервисов, которые обеспокоены случайным выпуском информации через непредвиденный доступ к данным кэша.структур.Хотя использование этой директивы может улучшить конфиденциальность в некоторых случаях, мы предупреждаем, что она никоим образом не является надежным или достаточным механизмом обеспечения конфиденциальности.В частности, злонамеренные или скомпрометированные кэши могут не распознавать или подчиняться этой директиве, а коммуникационные сети могут быть уязвимы для прослушивания.


Однако я бы предложил использовать ManifestStaticFilesStorage вместо того, чтобы не кэшировать статическиефайлы в браузерах.Это добавит хэш md5 содержимого файла к имени файла.Следовательно, каждый раз, когда изменяется содержимое файла, имя файла изменяется, и браузер делает новый запрос к файлу.Таким образом, браузер может кэшировать статические файлы в течение более длительного времени, увеличивая производительность загрузки страницы.

Чтобы включить ManifestStaticFilesStorage, необходимо убедиться, что выполнены следующие требования:

  • для параметра STATICFILES_STORAGE установлено значение django.contrib.staticfiles.storage.ManifestStaticFilesStorage
  • для параметра DEBUG установлено значение False
  • вы собрали все свои статические файлы с помощью collectstatic команды управления

т.е.

# in settings.py
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
DEBUG = False

Пробег

python manage.py collectstatic

Мои ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...