Доступ к родительскому URL из iframe - PullRequest
163 голосов
/ 06 августа 2010

Хорошо, у меня есть страница, и на этой странице у меня есть 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

и тогда мой iframe URL будет

http: // qa-www.mysite.com/pageB.html

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

Ответы [ 16 ]

319 голосов
/ 12 октября 2011

Да, доступ к 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 приводит к «заблокированному фрейму с источником ...» * относится к 1011 *

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

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

document.location относится к «объекту Location, который содержит информацию об URL документа»;предположительно, текущий документ, то есть iframe, открытый в данный момент.Если window.location === window.parent.location, то для iframe href будет такой же , как у href.

содержащего родителя.
45 голосов
/ 18 апреля 2011

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

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

Ну, вместо HTML, чтобы указать iframe, используйте javascript для построения HTML-кода для вашего iframe, получите родительский URL через javascript «во время сборки» и отправьте его как параметр GET url в строке запроса вашего 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

28 голосов
/ 28 октября 2012

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

var currentUrl = document.referrer;

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

19 голосов
/ 06 августа 2010

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

Также возможно получить URL в зависимости от контекста. Смотрите другие ответы для более подробной информации.

18 голосов
/ 13 августа 2010

Для страниц в одном и том же домене и другом поддомене вы можете установить свойство 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

11 голосов
/ 19 сентября 2018

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

2 голосов
/ 11 апреля 2014
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;
2 голосов
/ 20 января 2012

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

Таким образом, когда страница загружается в iframe, вы знаете полный родительский URL и строку запроса страницы, которая его загрузила. С кросс-браузерной безопасностью это немного головная боль, если рассчитывать на что угодно, если вы используете разные домены.

1 голос
/ 19 июня 2019

Попробуйте:

document.referrer

Когда вы изменяетесь, вы находитесь в iframe, ваш хост - "referrer".

1 голос
/ 23 октября 2012

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

...