Предотвращение кэширования iframe в браузере - PullRequest
76 голосов
/ 15 апреля 2010

Как запретить Firefox и Safari кэшировать содержимое iframe?

У меня есть простая веб-страница с iframe для страницы на другом сайте. И внешняя страница, и внутренняя страница имеют заголовки ответа HTTP для предотвращения кэширования. Когда я нажимаю кнопку «назад» в браузере, внешняя страница работает правильно, но, несмотря ни на что, браузер всегда извлекает кэш страницы в фрейме. IE работает просто отлично, но Firefox и Safari доставляют мне неприятности.

Моя веб-страница выглядит примерно так:

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>

Переменная var всегда изменяется. Несмотря на то, что URL-адрес iframe изменился (и, следовательно, браузер должен сделать новый запрос к этой странице), браузер просто извлекает кэшированное содержимое.

Я изучил HTTP-запросы и ответы, идущие туда-сюда, и заметил, что даже если внешняя страница содержит <iframe src="webpage2.html?var=222" />, браузер все равно будет получать webpage2.html?var=111.

Вот что я пробовал до сих пор:

  • Изменение URL-адреса iframe со случайным значением var
  • Добавление заголовков Expires, Cache-Control и Pragma на внешнюю веб-страницу
  • Добавление заголовков Expires, Cache-Control и Pragma на внутреннюю веб-страницу

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

У меня заканчиваются идеи. Кто-нибудь знает, как остановить кеширование браузером содержимого iframed?

Обновление

Я установил Fiddler2, поскольку Даниэль предложил провести еще один тест, и, к сожалению, я все еще получаю те же результаты.

Это тест, который я выполнил:

  1. На внешней странице генерируется случайное число с использованием Math.random() в JSP.
  2. На внешней странице отображается случайное число на веб-странице.
  3. Внешняя страница вызывает iframe, передавая случайное число.
  4. На внутренней странице отображается случайное число.

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

Визуальный тест

Для быстрого теста я загружаю страницу, перехожу на другую страницу и затем нажимаю «назад». Вот результаты:

Исходная страница:

  • Наружная страница: 0.21300034290246206
  • Внутренняя страница: 0.21300034290246206

Покинуть страницу, затем вернуться назад:

  • Наружная страница: 0,4470929019483644
  • Внутренняя страница: 0,21300034290246206

Это показывает, что внутренняя страница кэшируется, хотя внешняя страница вызывает ее с другим параметром GET в URL. По какой-то причине браузер игнорирует тот факт, что iframe запрашивает новый URL; он просто загружает старый.

Тест Скрипача

Конечно, Фиддлер подтверждает то же самое.

(Я загружаю страницу.)

Внешняя страница называется. HTML:

0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206 называется.

(Я отхожу от страницы, а затем нанослю ответный удар).

Внешняя страница называется. HTML:

0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />

http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206 называется.

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

У кого-нибудь есть идеи, как запретить веб-браузеру кэшировать URL-адреса iframe?

Ответы [ 13 ]

0 голосов
/ 06 октября 2010

Вы пытались добавить различные варианты заголовка HTTP для no-cache на страницу iframe?

0 голосов
/ 29 июня 2010

Сделайте так, чтобы URL-адрес iframe указывал на страницу на вашем сайте, которая действует как прокси для извлечения и возврата фактического содержимого iframe. Теперь вы больше не связаны политикой того же происхождения (РЕДАКТИРОВАТЬ: не предотвращает проблему кэширования iframe).

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

Установили ли вы Fiddler2 ?

Это позволит вам точно увидеть, что запрашивается, что отправляется обратно и т. Д. Невероятно, чтобы браузер действительно использовал кеш для разных URL.

...