Ленивый HTTP-кеширование - PullRequest
       11

Ленивый HTTP-кеширование

2 голосов
/ 05 февраля 2011

У меня есть веб-сайт, который отображается посетителям через киоск. Люди могут взаимодействовать с ним. Однако, поскольку веб-сайт не размещается локально и использует подключение к Интернету, загрузка страниц происходит медленно.

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

Я подумал об использовании автономного кэширования HTML5 - но для этого требуется, чтобы я указал все ресурсы в файле манифеста, и это нереально для меня, так как веб-сайт довольно большой.

Есть ли другой способ реализовать это? Возможно, используя заголовки кэширования HTTP? Мне также понадобится какой-нибудь способ аннулировать кеш в какой-то момент, чтобы «протолкнуть» новые изменения в браузер ...

1 Ответ

2 голосов
/ 05 февраля 2011

Обычный подход к решению подобных проблем заключается в использовании заголовков кэширования HTTP в сочетании с продуманным построением URL-адресов для ресурсов, на которые ссылаются ваши страницы.

Общая идея такова: каждый ресурс, загружаемый вашей страницей (изображения, скрипты, файлы CSS и т. Д.), Должен иметь уникальный версионный URL.Например, вместо загрузки /images/button.png вы загрузите /images/button_v123.png, а при изменении этого файла его URL-адрес изменится на /images/button_v124.png.Как правило, это выполняется путем перезаписи URL-адресов по статическим URL-адресам файлов, так что, например, веб-сервер знает, что /images/button_v124.png должен действительно загружать файл /images/button.png из файловой системы веб-сервера.Создание номеров версий можно выполнить, добавив номер сборки, используя CRC содержимого файла или многими другими способами.

Затем необходимо убедиться, что, где бы URL ни создавались на родительской странице, они ссылаются на версионный URL.Очевидно, что для этого требуется динамический код, используемый для построения всех URL-адресов, что может быть достигнуто либо путем корректировки кода, используемого для генерации ваших страниц, либо с помощью плагинов для всего сервера, которые влияют на все запросы text/html.

Затем вы устанавливаете заголовок Expires для всех запросов ресурсов (изображения, сценарии, файлы CSS и т. Д.) На дату в далеком будущем (например, через 10 лет).Это эффективно кеширует их навсегда.Это означает, что все запросы, загружаемые каждой из ваших страниц, всегда будут выбираться из кэша;аннулирование кэша никогда не происходит, и это нормально, потому что когда базовый ресурс изменяется, родительская страница будет использовать новый URL для его поиска.

Наконец, вам нужно выяснить, как вы хотите кэшировать свои «родительские» страницы,То, как вы это делаете, является суждением.Вы можете использовать ETag / If-None-Match заголовки HTTP, чтобы каждый раз проверять наличие новой версии страницы, что очень быстро загрузит страницу из кэша, если сервер сообщит, что она не изменилась.Или вы можете использовать Expires (и / или Max-Age), чтобы перезагрузить родительскую страницу из кэша в течение заданного периода времени перед проверкой сервера.

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

...