Предотвращение кэширования 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, как Даниэль предложил выполнить еще один тест, и, к сожалению, я все еще получаю те же результаты.
это тест, который я выполнил:
- внешняя страница генерирует случайное число с помощью
Math.random()
в JSP. - внешняя страница отображает случайное число на веб-странице.
- внешняя страница вызывает iframe, передавая случайное число.
- внутренняя страница отображает случайные число.
С помощью этого теста я могу точно видеть, какие страницы обновляются, а какие страницы кэшируются.
Визуальные Тест
для быстрого теста я загружаю страницу, перехожу на другую страницу, а затем нажимаю "назад."Вот результаты:
Оригинальные Страницы:
- Внешняя Страница: 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 ответов:
укажите 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 + '×tamp=' + 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-адресов.
Если вы хотите получить действительно crazy вы могли бы реализовать имя страницы как динамический url-адрес, который всегда разрешает одну и ту же страницу, а не параметр querystring?
предполагая, что вы находитесь в офисе, проверьте, есть ли кэширование происходит на сетевом уровне. Поверь мне, это возможно. Ваши ИТ-специалисты смогут сказать вам, есть ли какая-либо сетевая инфраструктура вокруг кэширования HTTP, хотя, поскольку это происходит только для iframe, это маловероятно.