Ошибка “Доступ запрещен” при доступе к объекту документа iframe

StackOverflow https://stackoverflow.com/questions/151362

  •  02-07-2019
  •  | 
  •  

Вопрос

Для размещения AJAX-форм в форме со многими параметрами я использую решение по созданию iframe, отправив в него форму по почте, а затем получив доступ к iframeсодержание.в частности, я получаю доступ к контенту следующим образом:

$("some_iframe_id").get(0).contentWindow.document

Я протестировал это, и это сработало.

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

Я почти уверен, что раньше это работало.У кого-нибудь есть догадки?

, Если я выражаюсь недостаточно ясно:Я отправляю сообщение в тот же домен.Так что это не междоменный запрос.Я тестирую только в IE.

P.S.Я не могу использовать простые запросы ajax POST (не спрашивайте ...)

Это было полезно?

Решение

Решил это сам!

Проблема заключалась в том, что, несмотря на то, что был отправлен правильный ответ (проверенный с помощью Fiddler), он отправлялся с кодом ошибки HTTP 500 (вместо 200).

Таким образом, получается, что если ответ отправляется с кодом ошибки, IE заменяет содержимое iframe с сообщением об ошибке, загруженным с диска (res://ieframe.dll/http_500.htm), и это вызывает ошибку "отказано в междоменном доступе".

Другие советы

Остерегайтесь ограничений безопасности, связанных с Фреймы iFrames, как Междоменный ограничение (оно же CORS).Ниже приведены 3 распространенные ошибки, связанные с CORS :

  1. Загрузите iFrame с другим доменом.(Пример:открытие "www.foo.com" пока верхняя рамка находится "www.ooof.com")

  2. Загрузите iFrame с другим портом:URL-адрес iFrame портвейн отличается от такового на верхней раме.

  3. Различные протоколы :загрузка ресурса iFrame через HTTPS, в то время как родительский фрейм использует HTTP.

Моя проблема заключалась в том, что X-Frame-Options HTTP-заголовок.В моей конфигурации Apache он установлен на:

Header always append X-Frame-Options DENY

Удаление его позволило ему работать.В частности, в моем случае я использовал iframe transport для jQuery с плагином jQuery file upload для загрузки файлов в IE 9 и IE 10.

Я знаю, что этот вопрос очень старый, но я хотел бы упомянуть, что приведенный выше ответ сработал для меня:настройка document.domain таким образом, чтобы он был одинаковым на каждой из страниц - родительской странице и странице iframe.Однако в ходе своих поисков я нашел эту интересную статью:

http://softwareas.com/cross-domain-communication-with-iframes

Обратите внимание, если у вас есть iframe с src='javascript:void(0)' тогда javascript, как frame.document.location =... произойдет сбой с ошибкой "Отказано в доступе" в IE.Использовал библиотеку javascript, которая взаимодействует с целевым фреймом.Несмотря на то, что местоположение, на которое он пытался изменить фрейм, находилось в том же домене, что и родительский, для iframe изначально было установлено значение javascript:void, что вызвало ошибку "отказано в междоменном доступе".

Чтобы решить эту проблему, я создал страницу blank.html на своем сайте, и если мне нужно заранее объявить iframe, который изначально будет пустым до изменения с помощью javascript, то я указываю его на пустую страницу, чтобы src='/content/blank.html' находится в том же домене.

В качестве альтернативы вы могли бы полностью создать iframe с помощью javascript, чтобы вы могли установить src при его создании, но в моем случае я использовал библиотеку, которая требовала, чтобы iframe уже был объявлен на странице.

По сути, эта ошибка возникает, когда документ во фрейме и за пределами ii имеют разные домены.Поэтому, чтобы предотвратить перекрестные скрипты, браузеры отключают такое выполнение.

если это проблема с доменом (или поддоменом), например www.foo.com отправка запроса на www.api.foo.com

на каждой странице вы можете установить

document.domain = www.foo.com

чтобы разрешить "междоменные" разрешения

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top