Ошибка “Доступ запрещен” при доступе к объекту документа iframe
-
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 :
Загрузите iFrame с другим доменом.(Пример:открытие "www.foo.com" пока верхняя рамка находится "www.ooof.com")
Загрузите iFrame с другим портом:URL-адрес iFrame портвейн отличается от такового на верхней раме.
Различные протоколы :загрузка ресурса 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
чтобы разрешить "междоменные" разрешения