Доступ к родительскому 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;