Хорошо, у меня есть страница, и на этой странице у меня есть 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), я получаю ту же самую ошибку отказа в доступе. Таким образом, кажется, что даже субдомены считаются межсайтовыми скриптами, это правильно, или я что-то не так делаю?
источник
<iframe src="url?parent=parent-url"></iframe>
Ответы:
Ты прав. Субдомены по-прежнему считаются отдельными доменами при использовании фреймов. Можно передавать сообщения с использованием
postMessage(...)
, но другие API JS намеренно сделаны недоступными.Также все еще возможно получить URL в зависимости от контекста. Смотрите другие ответы для более подробной информации.
источник
Да, доступ к URL родительской страницы не разрешен, если iframe и главная страница не находятся в одном (суб) домене. Однако, если вам нужен только URL главной страницы (то есть URL браузера), вы можете попробовать это:
Примечание:
window.parent.location
позволено; он избегает ошибки безопасности в OP, которая вызвана доступом кhref
свойству:window.parent.location.href
вызывает «Заблокирован кадр с источником ...»document.referrer
ссылается на «URI страницы, которая ссылается на эту страницу». Это может не вернуть содержащий документ, если какой-то другой источник определилiframe
местоположение, например:document.referrer
будет домен 3 , а не содержащий домен 1document.location
ссылается на «объект Location, который содержит информацию об URL документа»; предположительно текущий документ, то есть iframe, открытый в данный момент. Когдаwindow.location === window.parent.location
, то IFrame - хhref
это же как содержащий родитель этоhref
.источник
document.domain
верхний и самый внутренний фрейм. может быть.var url = (parent !== window) ? document.referrer : document.location;
Referer-Policy
заголовка.Я только что нашел обходной путь для этой проблемы, который настолько прост, и все же я не нашел ни одного обсуждения, где бы упоминалось об этом. Это требует контроля родительского кадра.
В вашем iFrame, скажем, вы хотите этот iframe: src = "http://www.example.com/mypage.php"
Ну, вместо HTML, чтобы указать iframe, используйте javascript для построения HTML для вашего iframe, получите родительский URL через javascript «во время сборки» и отправьте его в качестве параметра GET url в строке запроса вашей цели src, например так:
Затем найдите себе функцию синтаксического анализа URL-адреса javascript, которая анализирует строку URL-адреса, чтобы получить переменную url, которую вы ищете, в данном случае это «url».
Я нашел отличный анализатор строк URL здесь: http://www.netlobo.com/url_query_string_javascript.html
источник
Если ваш iframe из другого домена (кросс-домен), вам просто нужно использовать это:
и - здесь у вас есть основной URL!
источник
window.location.reload(true)
), это больше не работает. Тогда referrer - это URL самого iframe.Для страниц в одном домене и другом поддомене вы можете установить
document.domain
свойство с помощью javascript.И родительский фрейм, и iframe должны установить в свой document.domain что-то общее между ними.
то есть
www.foo.mydomain.com
иapi.foo.mydomain.com
каждый из них может использоватьfoo.mydomain.com
или просто,mydomain.com
и быть совместимым (нет, вы не можете установить их обаcom
из соображений безопасности ...)Также обратите внимание, что document.domain - это улица с односторонним движением. Попробуйте выполнить следующие три утверждения по порядку:
Современные браузеры также могут использовать window.postMessage для общения между источниками, но это не будет работать в IE6. https://developer.mozilla.org/en/DOM/window.postMessage
источник
Будет работать следующая строка:
document.location.ancestorOrigins[0]
эта возвращает доменное имя предка.источник
document.location.ancestorOrigins
возвращаетсяundefined
за мнойПопытайся:
Когда вы изменяетесь, вы находитесь в iframe, ваш хост - это «реферер».
источник
У меня были проблемы с этим. Если вы используете такой язык, как php, когда ваша страница впервые загружается в iframe, захватите ее
$_SERVER['HTTP_REFFERER']
и установите для нее переменную сеанса.Таким образом, когда страница загружается в iframe, вы знаете полный родительский URL и строку запроса страницы, которая его загрузила. С кросс-браузерной безопасностью это немного головная боль в расчете на window.parent, если вы используете разные домены.
источник
Я обнаружил, что приведенный выше пример ранее работал, когда скрипт выполнялся в iframe, однако он не получал URL, когда скрипт выполнялся вне iframe, потребовалась небольшая корректировка:
источник
Я не мог заставить работать предыдущее решение, но я обнаружил, что если я установлю iframe scr, например,
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
то смогу в извлечении iframethisdomain.com/thisfolder
, используя следующий javascript:источник
Проблема с PHP $ _SERVER ['HTTP_REFFERER'] заключается в том, что он дает полный URL-адрес страницы, которая привела вас на родительскую страницу. Это не то же самое, что родительская страница, сама по себе. Хуже того, иногда нет http_referer, потому что человек набрал URL-адрес родительской страницы. Итак, если я попаду на вашу родительскую страницу с yahoo.com, то yahoo.com станет http_referer, а не вашей страницей.
источник
Я обнаружил в тех случаях, когда
$_SERVER['HTTP_REFERER']
не работает (я смотрю на вас, Safari),$_SERVER['REDIRECT_SCRIPT_URI']
была полезная резервная копия.источник
В Chrome можно использовать location.ancestorOrigins. Он вернет все родительские URL.
источник
Я знаю, что он очень старый, но это поражает меня, никто не рекомендовал просто передавать куки из одного домена в другой. Поскольку вы используете субдомены, вы можете делиться файлами cookie с базового домена на все субдомены, просто установив файлы cookie в URL
.basedomain.com
Затем вы можете поделиться любыми данными через куки.
источник
Это помогло мне получить доступ к URL-адресу iframe.
источник
Получить все родительские функции Iframe и HTML
источник