Ошибка доступа "Access denied" при доступе к объекту document iframe
Для публикации форм AJAX в форме со многими параметрами я использую решение для создания iframe
, отправляя форму ему POST, а затем получая доступ к контенту iframe
.
в частности, я обращаюсь к контенту следующим образом:
$("some_iframe_id").get(0).contentWindow.document
Я тестировал его, и он работал.
На некоторых страницах я начал получать ошибку "Доступ лишен". Насколько я знаю, это не должно происходить, если iframe обслуживается из того же домена.
Я уверен, что он работал раньше. Кто-нибудь знает?
Если я не буду достаточно ясным: я отправляю в тот же домен. Таким образом, это не междоменный запрос. Я тестирую только IE.
P.S. Я не могу использовать простые ajax POST-запросы (не спрашивайте...)
Ответы
Ответ 1
Решил сам!
Проблема заключалась в том, что даже при отправке правильного ответа (проверяется с помощью Fiddler) он отправляется с кодом ошибки HTTP 500 (вместо 200).
Итак, получается, что если ответ отправляется с кодом ошибки, IE заменяет содержимое iframe
сообщением об ошибке, загруженным с диска (res://ieframe.dll/http_500.htm
), и это вызывает междоменный доступ отклонили ошибку.
Ответ 2
ошибки перекрестного домена, вызванные 3 вещами, когда дело касается iFrames:
-
откройте iFrame с другим URL (например, откройте www.foo.com) с родительской страницы (www.ooof.com)
-
разные порты (открытие iframe с url:), отличное от исходного порта
-
различные протоколы: открытие iFrame с HTTPS-url с родительской страницы, которая является HTTP
проверьте их, если вы столкнулись с этой проблемой.
Ответ 3
Моя проблема была в заголовке X-Frame-Options
HTTP. Моя конфигурация Apache имеет значение:
Header always append X-Frame-Options DENY
Удаление его позволило ему работать. В частности, в моем случае я использовал транспорт iframe для jQuery с плагином загрузки файла jQuery для загрузки файлов в IE 9 и IE 10.
Ответ 4
Я знаю, что этот вопрос супер-старый, но я хотел бы упомянуть, что вышеупомянутый ответ сработал у меня: установка document.domain будет одинаковым на каждой странице - родительской и iframe-странице. Однако в моем поиске я нашел эту интересную статью:
http://softwareas.com/cross-domain-communication-with-iframes
Ответ 5
Обратите внимание, что если у вас есть iframe с src='javascript:void(0)'
, тогда javascript, например frame.document.location =...
, не будет работать с ошибкой Access Denied в IE. Использует библиотеку javascript, которая взаимодействует с целевым фреймом. Несмотря на то, что местоположение, в котором он пытался изменить фрейм, находилось в том же домене, что и родительский, для iframe изначально был установлен javascript: void, который вызвал отказ в доступе к перекрестному домену.
Чтобы решить эту проблему, я создал на моем сайте страницу blank.html, и если мне нужно заранее объявить iframe, который изначально будет пустым, пока не будет изменен с помощью javascript, тогда я укажу его на пустую страницу, чтобы src='/content/blank.html'
в той же области.
В качестве альтернативы вы можете полностью создать iframe через javascript, чтобы вы могли установить src при его создании, но в моем случае я использовал библиотеку, которая потребовала, чтобы iframe уже был объявлен на странице.
Ответ 6
В основном, эта ошибка возникает, когда документ в кадре и за пределами ii имеет разные домены. Поэтому, чтобы предотвратить использование браузеров с параллельными скриптами, отключите такое выполнение.
Ответ 7
если это проблема домена (или поддомена), такая как www.foo.com, отправив запрос на www.api.foo.com
на каждой странице вы можете установить
document.domain = www.foo.com
чтобы разрешать "междоменные" разрешения