2010-12-17 5 views
1

У меня есть веб-страница с ресурсом на постоянно меняющемся адресе. Например, веб-страница может быть на http_: //www.mysite.com/? Page = page1, и она может содержать изображение http_: //www.mysite.com/? Img = image999. Хотя оба ресурса находятся на моем сайте, я не контролирую размещение определенных изображений на определенных страницах.Предотвращение частичного кэширования веб-ресурсов

Я установил заголовки для длительного кэширования на страницах, а также изображения. Но если пользовательский агент кэширует только веб-страницы, а не изображения (например, пользователь очищает кеш и изображение очищается от кеша), пользовательский агент будет извлекать страницу из кеша и делать запрос для /? Img = image999. Однако на этом этапе изображение больше не находится на /? Image = image999, но вместо этого скажем, /? Image = image998. Таким образом, изображение не будет отображаться пользователю.

Какое решение этой проблемы? Вот те, о которых я мог думать: -

  1. Отключить кэширование как веб-страниц, так и изображений. Худшее решение.
  2. Отключить кэширование только веб-страниц. Лучшее решение.
  3. Помните на стороне сервера, что image998 был один раз в image999, и если запрос приходит для /? Image = image999, перенаправляет/переносит его на /? Image = image998. Лучшее решение, но боль для реализации. EDIT: На самом деле, сейчас я понимаю, что это невозможно в моей ситуации sadface

Моя точная проблема не имеет дело с изображениями, но с HTML5 видео. В частности, в Google Chrome я заметил, что видео, похоже, довольно часто удаляется из кэша, хотя я устанавливаю даты истечения срока действия в кеше в течение 1 года. Но меня все еще интересует решение для общих ресурсов, независимо от политики кэширования Chrome.

EDIT: Для подтверждения, я использую кеширование «dont revalidate» + «expires in 1 year» как на веб-странице, так и на изображении. Таким образом, если UA запрашивает веб-страницу (page1) + изображение (image999) один раз, он не будет удалять сервер для последующих запросов, и все это хорошо. Проблема возникает, когда изображение выпадает из кэша UA, но веб-страница остается. В этой ситуации UA будет не запросить сервер для веб-страницы, но будет запросить сервер для изображения (image999). Тем не менее, в то же время изображение изменило URL-адреса (image999 -> image998), и сервер вернет 404. В результате UA не отобразит изображение. Как я могу это предотвратить?

+0

Страница html, содержащая ссылку на img999, должна измениться, и браузер должен запросить новую страницу вместо использования кешированной версии, поскольку она не получит HTTP-заголовок NOT MODIFIED. Я не понимаю эту проблему. В конце вопроса вы говорите, что проблема в том, что он не кэшируется, что не так, как вы сказали в начале вопроса (имея ссылку на устаревший ресурс). – 2010-12-17 00:10:58

ответ

0

Как упомянуто в вопросе, эти решения я могу думать, если я ограничиваю себя в использовании Expires заголовка: -

  1. Отключить кэширование как для веб-страниц и изображений.

  2. Включить только кеширование изображений. Каждый запрос на веб-страницу будет обрабатываться сервером, но запросы на кешированные изображения не попадут на сервер.

  3. Включить кеширование как для веб-страниц, так и для изображений. Для запросов к устаревшим изображениям отправьте ответ «301 Moved Permently» с указанием местоположения нового изображения и попросите UA кэшировать его. (Мои тесты показывают, что Google Chrome не кэшировать 301 запросов или содержание его перенаправлен независимо от заголовка Cache)

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