Доступ к родительскому URL-адресу из iframe

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

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

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... или другие подобные комбо, так как существует несколько способов получить одну и ту же информацию.

Итак, вот проблема. Мой iframe находится в том же домене, что и главная страница, но не в том же поддомене. Так, например, у меня есть

http:// www.mysite.com/pageA.html

и тогда мой URL iframe

протоколу HTTP:// qa-www.mysite.com/pageB.html

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

14 ответов


вы правы. Поддомены считаются отдельными доменами при использовании фреймов. Можно передавать сообщения с помощью postMessage(...), но другие API JS намеренно становятся недоступными.

также можно получить URL-адрес в зависимости от контекста. Дополнительные сведения см. в других ответах.


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

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

Примечание:

window.parent.location разрешено; это позволяет избежать ошибки безопасности в OP, которая вызвана доступом к href свойства: window.parent.location.href причины " заблокировали кадр с origin..."

document.referrer ссылается на " URI страницы, связанной с этой страницей.- Это может ...!--14-->не вернуть содержащих документ, если какой-то другой источник определяет iframe, например:

  • контейнер iframe @ Domain 1
  • отправляет дочерний iframe в домен 2
  • но в iframe ребенка... Домен 2 перенаправляет на домен 3 (т. е. для аутентификации, возможно SAML), а затем домен 3 направляет назад домен 2 (т. е. через форму представления (), стандартный метод SAML)
  • для ребенка iframe document.referrer будет домен 3, не содержащий домен 1

document.location относится к "объекту местоположения, который содержит информацию об URL-адресе документа"; предположительно настоящее документ, то есть iframe в настоящее время открыт. Когда window.location === window.parent.location, тогда iframe href - это то же самое as содержащего родителя href.


Я только что обнаружил обходной путь для этой проблемы, которая настолько проста, и все же я не нашел никаких обсуждений нигде, которые упоминают об этом. Это требует контроля родительского фрейма.

в вашем iFrame скажите, что вы хотите этот iframe: src="http://www.example.com/mypage.php"

Ну, вместо HTML, чтобы указать iframe, используйте javascript для создания HTML для вашего iframe, получите Родительский url через javascript "во время сборки" и отправьте его в качестве параметра URL GET в querystring вашей цели src, например:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

затем найдите функцию синтаксического анализа url javascript, которая анализирует строку url, чтобы получить переменную url, которую вы ищете, в этом случае это "url".

Я нашел отличный синтаксический анализатор строк url Здесь: http://www.netlobo.com/url_query_string_javascript.html


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

var currentUrl = document.referrer;

и-здесь у вас есть основной url!


для страниц в одном домене и разных поддоменах вы можете установить document.domain свойство через javascript.

и родительский фрейм, и iframe должны установить свой документ.домен-то, что является общим между ними.

т. е. www.foo.mydomain.com и api.foo.mydomain.com каждый может использовать либо foo.mydomain.com или просто mydomain.com и быть совместимыми (нет, вы не можете установить их обоих в com, по соображениям безопасности...)

кроме того, обратите внимание на этот документ.домен-это улица с односторонним движением. Рассмотрим выполнение следующих трех операторов по порядку:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

современные браузеры также могут использовать окно.postMessage, чтобы поговорить о происхождении, но он не будет работать в IE6. https://developer.mozilla.org/en/DOM/window.postMessage


var url = (window.location != window.parent.location) ? document.referrer: document.location;

я обнаружил, что приведенный выше пример ранее работал, когда скрипт выполнялся в iframe, однако это не так получение url-адреса при выполнении скрипта за пределами iframe, потребовалась небольшая корректировка:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

У меня были проблемы с этим. Если вы используете язык php при первой загрузке страницы в iframe grab $_SERVER['HTTP_REFFERER'] и установите его в переменную сеанса.

таким образом, когда страница загружается в iframe, вы знаете полный Родительский url-адрес и строку запроса страницы, которая его загрузила. С cross browser security это немного головная боль, рассчитывая на окно.родитель ничего, если вы разные домены.


Я не мог получить предыдущее решение для работы, но я узнал, что если я установил iframe scr, например http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder тогда я мог бы, в iframe extract thisdomain.com/thisfolder используя следующий javascript:

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

проблема с PHP $_SERVER ['HTTP_REFFERER'] заключается в том, что он дает полный url-адрес страницы, которая привела вас к родительской странице. Это не то же самое, что сама родительская страница. Хуже того, иногда нет http_referer, потому что человек набрал url родительской страницы. Итак, если я попаду на вашу родительскую страницу из yahoo.com тогда yahoo.com становится http_referer, а не вашей страницей.


Я нашел в случаях, когда $_SERVER['HTTP_REFERER'] не работает (я смотрю на вас, Safari),$_SERVER['REDIRECT_SCRIPT_URI'] была полезной резервной копией.


следующая строка будет работать:document.location.ancestorOrigins[0] этот возвращает доменное имя предка.


это сработало для меня, чтобы получить доступ к url-адресу iframe src.

window.document.URL

в chrome можно использовать местоположение.ancestorOrigins Он вернет все родительские URL-адреса


получить все родительские функции Iframe и HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;