Предотвращение кэширования iframe в браузере


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

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

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

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

The 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, потому что я заблокирован той же политикой происхождения.

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

обновление

Я установил 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.скрипач:1416/страница1.aspx?var=0.21300034290246206 называется.

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

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

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

http://ipv4.скрипач:1416/страница1.aspx?var=0.21300034290246206 называется.

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

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

13 74

13 ответов:

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

Это ошибка в Firefox:

https://bugzilla.mozilla.org/show_bug.cgi?id=356558

попробуйте этот метод:

<iframe src="webpage2.html?var=xxx" id="theframe"></iframe>

<script>
var _theframe = document.getElementById("theframe");
_theframe.contentWindow.location.href = _theframe.src;
</script>

я смог обойти эту ошибку, установив уникальный name атрибут на iframe-по какой-то причине, это, кажется, бюст кэша. Вы можете использовать любые динамические данные как name атрибут-или просто текущее время ms или ns в любом языке шаблонов, который вы используете. Это более приятное решение, чем те, что выше, потому что оно напрямую не требует JS.

в моем конкретном случае iframe строится через JS (но вы можете сделать то же самое через PHP, Ruby, что угодно), поэтому я просто использую Date.now():

return '<iframe src="' + src + '" name="' + Date.now() + '" />';

это исправляет ошибку в моем тестировании; наверное, потому что window.name во внутреннем окне.

Это ошибка в Firefox 3.5.

посмотреть.. https://bugzilla.mozilla.org/show_bug.cgi?id=279048

чтобы iframe всегда загружал свежий контент, добавьте текущую метку времени Unix в конец параметров GET. Браузер воспринимает его как "другой" запрос и будет искать новый контент.

в Javascript это может выглядеть так:

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;

попробовав все остальное (кроме использования прокси для содержимого iframe), я нашел способ предотвратить кэширование содержимого iframe,из того же домена:

использовать .htaccess и переписать правило и изменить iframe

Я установил атрибут iframe src позже в своем приложении. Чтобы избавиться от кэшированного содержимого внутри iframe в начале приложения я просто делаю:

myIframe.src = "";

... где-то в начале кода js (например, в обработчике jquery $ ())

спасибо http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/

Я нашел эту проблему в последнем Chrome, а также в последнем Safari на Mac OS X по состоянию на 17 марта 2016 года. Ни одно из исправлений выше не работало для меня, включая назначение src пустым, а затем обратно на какой-либо сайт, или добавление в какой-то случайно названный параметр "имя", или добавление случайного числа в конце URL-адреса после хэша, или назначение окна содержимого href для src после назначения src.

в моем случае это было потому, что я использовал Javascript для обновления IFRAME, и только переключение хэша в URL.

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

У меня также была эта проблема в 2016 году с iOS Safari. То, что, казалось, работало на меня, было давая GET-параметр iframe src и значение для него, как это

<iframe width="60%" src="../other/url?cachebust=1" allowfullscreen></iframe>

Как вы сказали, проблема здесь не кэширование содержимого iframe, а iframe url кэширование.

по состоянию на сентябрь 2018 года, похоже, проблема все еще возникает в Chrome, но не в Firefox.

Я пробовал много вещей (добавление изменяющегося параметра GET, очистка url-адреса iframe в onbeforeunload, обнаружение "перезагрузки из кэша" с помощью файла cookie, настройка различных заголовков ответов), и вот только два решения, которые работали с я:

1-Простой способ: создайте свой iframe динамически из javascript

например:

const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)

2-извилистый путь

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

и

установите url iframe из javascript с дополнительным изменением параметров поиска, например это:

const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url

(упрощенная версия, остерегайтесь других параметров поиска)

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

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

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

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

предполагая, что вы находитесь в офисе, проверьте, есть ли кэширование происходит на сетевом уровне. Поверь мне, это возможно. Ваши ИТ-специалисты смогут сказать вам, есть ли какая-либо сетевая инфраструктура вокруг кэширования HTTP, хотя, поскольку это происходит только для iframe, это маловероятно.