Доступ к родительскому 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]
этот возвращает доменное имя предка.
получить все родительские функции 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;