Я устанавливаю заголовки истечения срока давности для моего CSS / Javascript, чтобы браузеры больше никогда не запрашивали файлы после их кэширования. У меня также есть простой механизм управления версиями, так что если файлы изменятся, клиенты узнают.
В основном у меня есть тег шаблона, и я делаю что-то вроде
<script type="text/javascript" src="{{ MEDIA_URL }}{% versioned "javascript/c/c.js" %}"></script>
, который станет
<script type="text/javascript" src="http://x.com/media/javascript/c/c.min.js?123456"></script>
.
Тег шаблона открывает файл javascript/c/c.js.v
, где он находит номер версии и добавляет его в строку запроса. Версия генерируется сценарием оболочки (пока запускается вручную, вероятно, добавит хук предварительной фиксации), который проверяет, изменился ли файл (с помощью git diff
).
Это все нормально работает, КРОМЕ:
Я хочу реализовать такой же тип управления версиями для изображений. Но на изображения можно ссылаться из CSS, который является статическим файлом (обслуживается nginx), поэтому там нет тега шаблона.
Как лучше подходить к управлению версиями файлов?
В качестве альтернативы я подумываю заменить тег шаблона промежуточным программным обеспечением, которое изменяет все ссылки перед возвратом ответа. Это лучше, чем тег шаблона, который может быть ошибочно опущен. Но все еще не решает проблему изображений, на которые ссылаются из CSS.
Кроме того, я знаю, что наличие версии как части строки запроса может вызвать проблемы с некоторыми прокси-серверами, не кэширующими файл - поэтому я считаю целесообразным сделать версию частью имени файла - например, javascript/c/c.123456.js
.
Примечание. Похоже, что с помощью Django невозможно решить эту проблему (очевидно, поскольку я даже не обслуживаю CSS через Django). Но должно быть решение, возможно, включающее некоторые уловки nginx.