Доступ к родительскому URL из iframe
Хорошо, у меня есть страница и на этой странице у меня есть iframe. Мне нужно сделать это на странице iframe, узнать, какой URL-адрес главной страницы.
Я искал вокруг, и я знаю, что это невозможно, если моя страница iframe находится в другом домене, поскольку это межсайтовый скриптинг. Но везде, где я читал, говорится, что если страница iframe находится в том же домене, что и родительская страница, она должна работать, например, если:
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href
... или другие подобные комбо, так как существует несколько способов получить одну и ту же информацию.
В любом случае, вот и проблема. Мой iframe находится в том же домене, что и на главной странице, но не в том же SUB-домене. Так, например, я
http://www.mysite.com/pageA.html
а затем мой URL-адрес iframe
http://qa-www.mysite.com/pageB.html
Когда я пытаюсь захватить URL-адрес с pageB.html
(на странице iframe), я продолжаю получать ту же ошибку отказа в доступе. Таким образом, кажется, что даже поддомены считаются межсайтовыми скриптами, это правильно или я что-то не так?
Ответы
Ответ 1
Ты прав. Субдомены по-прежнему считаются отдельными доменами при использовании фреймов. Можно передавать сообщения, используя postMessage(...)
, но другие JS API намеренно делаются недоступными.
Также все еще возможно получить URL в зависимости от контекста. Смотрите другие ответы для более подробной информации.
Ответ 2
Да, доступ к 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
вызывает "Заблокирован фрейм с источником..."
document.referrer
ссылается на "URI страницы, которая ссылается на эту страницу". Это может не вернуть содержащий документ, если какой-то другой источник определил местоположение iframe
, например:
- Контейнер iframe @Домен 1
- Отправляет дочерний iframe в домен 2
- Но в дочернем iframe... Домен 2 перенаправляет в Домен 3 (то есть для аутентификации, может быть, SAML), а затем Домен 3 направляет обратно в Домен 2 (то есть через отправку формы(), стандартная техника SAML)
- Для дочернего iframe
document.referrer
будет домен 3, а не содержащий домен 1
document.location
ссылается на "объект Location, который содержит информацию об URL документа"; предположительно текущий документ, то есть iframe, открытый в данный момент. Когда window.location === window.parent.location
, тогда iframe href
совпадает с содержащим родительским href
.
Ответ 3
Я только что обнаружил обходной путь для этой проблемы, который так прост, и все же я не нашел дискуссий нигде, где бы это ни упоминалось. Это требует контроля над родительским фреймом.
В iFrame скажите, что вы хотите использовать этот iframe: src= "http://www.example.com/mypage.php"
Ну, вместо HTML, чтобы указать iframe, используйте javascript для построения HTML для вашего iframe, получите родительский url через javascript "во время сборки" и отправьте его как параметр GET url в строке запроса вашего src target, так:
<script type="text/javascript">
url = parent.document.URL;
document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>
Затем найдите функцию javascript url parsing, которая анализирует строку url, чтобы получить переменную url, которой вы пользуетесь, в этом случае это "url".
Я нашел отличный синтаксический анализатор строк:
http://www.netlobo.com/url_query_string_javascript.html
Ответ 4
Если ваш iframe из другого домена (перекрестный домен), вам просто нужно будет использовать это:
var currentUrl = document.referrer;
и - здесь у вас есть главный url!
Ответ 5
Для страниц одного домена и другого поддомена вы можете установить свойство document.domain
с помощью javascript.
Как родительский фрейм, так и iframe должны установить свой document.domain в нечто общее между ними.
то есть.
www.foo.mydomain.com
и api.foo.mydomain.com
могут использовать либо foo.mydomain.com
, либо просто mydomain.com
и быть совместимыми (нет, вы не можете установить их оба в com
по соображениям безопасности...)
также обратите внимание, что document.domain - это односторонняя улица. Попробуйте выполнить следующие три оператора в следующем порядке:
// 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
Современные браузеры также могут использовать window.postMessage для разговора по истокам, но в IE6 это не сработает.
https://developer.mozilla.org/en/DOM/window.postMessage
Ответ 6
Будет работать следующая строка: document.location.ancestorOrigins[0]
эта строка возвращает имя домена предка.
Ответ 7
У меня были проблемы с этим. Если вы используете язык, например php, когда ваша страница сначала загружается в iframe grab $_SERVER['HTTP_REFFERER']
и устанавливает его в переменную сеанса.
Таким образом, когда страница загружается в iframe, вы знаете полный родительский URL-адрес и строку запроса на загружаемой странице. С кросс-браузером это немного головная боль, рассчитывающая на window.parent что угодно, если вы разные домены.
Ответ 8
var url = (window.location != window.parent.location) ? document.referrer: document.location;
Я обнаружил, что приведенный выше пример предположил, что ранее работал, когда script выполнялся в iframe, однако он не
получить URL-адрес, когда script был выполнен за пределами iframe,
требуется небольшая корректировка:
var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
Ответ 9
Я не мог получить предыдущее решение для работы, но я узнал, что если я установлю 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];
Ответ 10
Проблема с PHP $_SERVER ['HTTP_REFFERER'] заключается в том, что он дает полный URL страницы страницы, которая привела вас на родительскую страницу. Это не то же самое, что и родительская страница. Хуже того, иногда нет http_referer, потому что человек напечатал URL-адрес родительской страницы. Итак, если я доберусь до вашей родительской страницы с yahoo.com, тогда yahoo.com станет http_referer, а не вашей страницей.
Ответ 11
Я нашел в случаях, когда $_SERVER['HTTP_REFERER']
не работает (я смотрю на вас, Safari), $_SERVER['REDIRECT_SCRIPT_URI']
была полезной резервной копией.
Ответ 12
В Chrome можно использовать location.ancestorOrigins. Он вернет все родительские URL.
Ответ 13
Я знаю, что он очень старый, но это поражает меня, никто не рекомендовал просто передавать куки с одного домена на другой. Поскольку вы используете субдомены, вы можете делиться файлами cookie с базового домена на все субдомены, просто установив файлы cookie на URL .basedomain.com
Затем вы можете поделиться любыми данными через куки.
Ответ 14
Попытайся:
document.referrer
Когда вы изменяете, вы находитесь в iframe, ваш хост - "реферер".
Ответ 15
Это помогло мне получить доступ к url iframe src.
window.document.URL
Ответ 16
Получить все родительские функции 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;