Кэширование собственного веб-сервера - PullRequest
0 голосов
/ 27 февраля 2010

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

Наш веб-сервер генерирует весь динамический контент в виде XML, и мы используем полустатические XSL-файлы для его отображения с некоторыми динамическими JSON-запросами, добавленными для хорошей меры, наряду с полустатическими изображениями. Я говорю «полустатически», потому что проблемы возникают, когда нам нужно обновить микропрограмму, которая может изменить XSL и файлы изображений.

Вот что нужно сделать: кешировать XSL и файлы изображений, а не кешировать ответы XML и JSON. У меня есть полный контроль над HTTP-ответом, и в настоящее время я:

  1. Использование ETag с XSL и файлами изображений, использование измененного времени и размера для генерации ETag
  2. Настройка Cache-Control: отсутствие кэширования в ответах XML и JSON

Как я уже сказал, все работает прекрасно до обновления прошивки, когда XSL и файлы изображений иногда кэшируются. Я видел, что он отлично работает с последними версиями Firefox и Safari, но у меня были некоторые проблемы с IE.

Я знаю, что одним из решений этой проблемы было бы просто переименовать XSL и файлы изображений после каждой версии (например, logo-v1.1.png, logo-v1.2.png) и установить заголовок Expires на дату в будущее, но это будет сложно с файлами XSL, и я бы хотел этого избежать.

Примечание. На устройстве есть часы, но пользователь должен их установить, и они не могут быть на 100% надежными, что может вызвать проблемы с кэшированием при использовании ETags.

Какую лучшую практику я должен использовать? Я хотел бы избежать как можно большего числа запросов веб-сервера, но недействительными старые XSL и файлы изображений после обновления программного обеспечения являются приоритетом № 1.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2010

Попробуйте Cache-Control: no-store. no-cache сообщает клиенту, что ответ может быть кэширован; он просто не используется повторно, если только кеш не может связаться с исходным сервером.

Кстати, установка только ETag не сделает кешируемый ответ; Вы также должны установить Cache-Control: max-age=nnn.

Вы можете проверить, как ваши ответы будут обрабатываться с помощью http://redbot.org/

0 голосов
/ 28 апреля 2010

Работаем ли мы над одним проектом? Я вошел в тупик, придумывая лучший способ справиться с этим.

Я установил срок действия моих файлов .html и .shtml (динамические данные JSON). («Cache-Control: no-cache \ r \ nExpires: -1 \ r \ n») Все остальное истекает через 10 лет. («Cache-Control: max-age = 290304000 \ r \ n»)

Мой make-файл запускает скрипт perl для всех файлов .html и определяет то, что вы называете «полустатическим» контентом (images, javascript, css.) Затем скрипт запускает контрольную сумму md5 для этих файлов и добавляет контрольную сумму к файл:

<script type="text/Javascript" src="js/all.js?7f26be24ed2d05e7d0b844351e3a49b1">

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

Я использую all.js и all.css, потому что все объединено и минимизировано с использованием одного и того же сценария.

Из любопытства, какой встроенный веб-сервер вы используете?

...