Заставить браузер перезагружать css/js, только если они изменились
Есть много вопросов и ответов по SO, связанных с моей проблемой [Я хочу, чтобы браузер кешировал js / css навсегда. Во время новой версии, если некоторые файлы js / css были обновлены, браузер должен перезагрузить и кэшировать их.]
Это решение показалось мне наиболее подходящим: каков элегантный способ заставить браузеры перезагружать кэшированные файлы CSS/JS?
Однако есть только одна вещь, которую я не могу понять. Решение использует last_modified_time. Тем не менее, мне не разрешено использовать его. Мне нужно использовать какой-то другой механизм.
Какие есть варианты? Есть ли возможность предварительно рассчитать версии во время сборки и обновить (заменить) их в jsps через скрипт сборки (перед развертыванием, чтобы номера версий не вычислялись во время выполнения)? Какой-нибудь существующий инструмент для этой цели? Я использую Java/Jsp.
3 ответа
Возможно, это не лучший способ, но я сейчас и делаю:
- Все мои js / css имеют номер редакции [source control = svn]
- Ссылки в моем jsp похожи на /foo/path1/path2/xyz000000/foo.
- Шаг сборки 1 - Генерация карты файлов css|js и их номеров ревизий
- Шаг сборки 2 - Замените ссылки xyz000000 в jsps на хэш версий SVN
- Правило в редакторе URL для направления всех /foo/path1/path2/xyz<767678>/foo. в /foo/path1/path2/foo.[js|css]
- Бесконечно кешируйте файлы css|js
- Всякий раз, когда есть фиксация, номер ревизии меняется, как и ссылки в.jsp
Мы всегда используем
file.css?[deploytimestamp]
Таким образом, файл CSS кэшируется для каждого развертывания на клиенте. То же самое касается нашего уменьшенного JavaScript. Это вариант для вас?
Создайте md5-хэш каждого CSS-файла после развертывания. Используйте этот хэш вместо метки времени в URL-адресе CSS.
file.css?[hash of file.css contents]
Может быть целесообразно рассчитать хэши один раз после развертывания и сохранить их для повышения производительности. Вы можете хранить их в базе данных или даже в массиве PHP в отдельном файле, который включен в код вашего сайта.