ПРОСТОЙ СЕРВЕРСИДНЫЙ КОНТРОЛЬ КЭША БЕЗ ЗАГОЛОВОК ИЛИ ПЕРЕДНЕГО СКРИПТА
Нулевая зависимость, Universal Language Edition
Вы можете принудительно выполнитьглобальное кэширование без использования заголовка путем добавления контрольной суммы md5 или sha1 к вашему имени файла.
Таким образом, он будет кешировать, если будет точное совпадение, и иначе обрабатывать его как новый ресурс.
- Работает во всех браузерах
- Проверяется как строгий HTML5 (изначально этого не происходило, но это было обновлено. Не проверено для XHTML, но, вероятно, не подходит для этого)
- Не требует дополнительных заголовков
- Обеспечивает хорошее разделение интересов внешнего и внутреннего интерфейса.
- Не требует проверки работоспособности на стороне клиента или проверки источника.
- Все, что может печатать html, может делать это последовательно, включая статический контент
- Если не статичный, легко расширить контроль времени выполнения для конечных пользователей (с аутентификацией, если необходимо) , который допускает простые флаги страницдля определения минимизированного, предварительно подтвержденного или отлаживаемого возвращаемого источника.
- Полностью инкапсулирует управление клиентским кэшем в механизме обслуживания контента, что упрощает обслуживание.
В качестве дополнительного преимущества, вводит версионное кэширование на стороне клиента автоматически путем отсчета контрольных сумм, которые кэшировал браузер, что может бытьполезно, если у вас есть альтернативные версии, и вам нужно выполнить модульное тестирование пакета выпуска, чтобы определить его минимальную стабильную версию зависимости или что-то в этом роде.
Вам не нужно когда-либо работатьс вашим браузером, чтобы кэширование больше не мешало процессу разработки.
Этот подход также можно использовать для версионных изображений, видео, аудио, файлов PDF и т. д. Практически любой ресурскоторые используются в качестве статических данных, будут работать аналогично, кэшироваться при первом запросе контента и сохраняться автоматически без дальнейшего рассмотрения, если файл не изменяется.
Это RFCдействительная разметка.Обратите внимание, что теги script и link имеют строку get:
?checksum=ba411cafee2f0f702572369da0b765e2
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Client Cache Control Example</title>
<meta name="description" content="You're only going to cache this when the content changes, and always when the content changes.">
<meta name="author" content="https://stackoverflow.com/users/1288121/mopsyd">
<!-- Example Stylesheet -->
<link rel="stylesheet" href="css/styles.css?checksum=ba411cafee2f0f702572369da0b765e2">
<!-- Example Script -->
<script src="js/scripts.js?checksum=ba411cafee2f0f702572369da0b765e2"></script>
</head>
<body>
</body>
</html>
Строка GET ?checksum=ba411cafee2f0f702572369da0b765e2
относится к хешу MD5 или SHA1 размера файла:ресурс.Его можно получить с помощью командной строки, языковой конструкции или путем хеширования его по значению заголовка Content-Length:
.Затем вы создаете свой атрибут href
или src
, добавляя его в качестве строки GET к имени файла.
Этот браузер будет интерпретировать их как отдельные и кэшировать отдельно.
Сервер будетигнорируйте параметр GET, если он является статическим ресурсом, но если он обслуживается динамически, то параметр GET будет доступен для языка интерпретации.
Это означает, что всякий раз, когда этот хэш изменяется в ссылках, браузер будеткэшируйте эту конкретную версию независимо один раз , а затем сохраняйте ее до тех пор, пока не останется навсегда или Expires:
, в зависимости от того, что произойдет раньше.
Поскольку контрольная сумма является прямым отражением размера файла, выможно установить Expires:
навсегда, и это не имеет большого значения.Вы по-прежнему будете видеть ваши изменения сразу же, как только этот файл изменит хотя бы один байт.
Создайте исходный код css или js с помощью любых утилит, которые вы обычно делаете.
Запустите контрольную сумму md5 или sha1 для размера файла во время выполнения , если вы обслуживаете динамически, и во время компиляции , если вы генерируете статический контент (например, документы ApiGen)., например) .
Служит обычному файлу с хэшем в виде строки GET, добавляемой к имени файла (например: styles.css
становится styles.css?checksum=ba411cafee2f0f702572369da0b765e2
)
Любое изменение в файле приводит к повторной записи, что означает, что вы видите реальное значение, отраженное немедленно.
Необязательно, но rad: Дополнительным преимуществом этого подхода является то, что вы можете легко установить флаг dev GET, который заставит ВСЕ интерфейсные исходные коды преобразовываться в предварительно подтвержденный источник dev с любым из ваших включить собственную настраиваемую функцию отладки или использовать ее для интерпретации флагов управления версиями. Вы можете выполнить избыточную проверку, чтобы убедиться, что флаг передается только с известного IP-адреса разработки, проверки подлинности прокси-сервера и т. Д. Сервером, и в противном случае он не учитывается, если вам требуется его безопасность. Я обычно делю свой внешний интерфейс по возможности, как это:
- Это то, что он делает в прямом эфире прямо сейчас (минимизированное производство, кэширование, по умолчанию,
?checksum=ba411cafee2f0f702572369da0b765e2
).
- Это то, что он должен делать в прямом эфире прямо сейчас, достаточно предварительно для того, чтобы я мог читать (предварительно обработанное производство, никогда не кэшируется ,
?debug_pretty_source=true
).
- Это то, что я использую, чтобы выяснить, что не делает то, что должно быть вживую, если оно существует в обоих предыдущих (предварительно подтверждено с включенной отладкой, никогда не кэшируется , ACL / белый список разрешен,
?debug_dev_enable=true
или аналогичный ).
Вы можете применить тот же принцип к выпускам пакетов, используя номера версий вместо контрольных сумм, при условии, что ваши версии не меняются. Контрольные суммы менее читабельны, но их легче автоматизировать и синхронизировать с точными изменениями, но суффиксы версий также полезны для проверки стабильности пакета, при условии, что номер версии отражает неизменный ресурс.