2010-08-05 4 views
130

Итак, у меня есть страница на странице и на этой странице У меня есть iframe. Мне нужно сделать это на странице iframe, узнать, какой URL-адрес главной страницы.Доступ к родительскому URL из iframe

Я искал вокруг, и я знаю, что это невозможно, если моя страница 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: // WWW QA-. mysite.com/pageB.html

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

+0

Вы можете просто передать его в URL кадра? Например, '' –

ответ

14

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

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

+1

Хорошо, что просто удары. Но, по крайней мере, я знаю, что я не схожу с ума: (хорошо, план Б. спасибо. (И жаль, что я не поместил свои вещи в теги, спасибо за редактирование) – chronofwar

+6

как это будет выбранный ответ? описания возможных решений ниже. – Anoyz

+1

Согласовано! Ответ ниже с 80 голосами намного лучше. Этот ответ содержится в спецификации html. – Ligemer

16

Для страниц в этом домене и в разных поддоменах вы можете установить свойство document.domain с помощью javascript.

Как родительский фрейм, так и iframe должны установить свой document.domain в нечто общее между ними.

т.е. 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 

Современные браузеры могут также использовать window.postMessage говорить по происхождению, но он не будет работать в IE6. https://developer.mozilla.org/en/DOM/window.postMessage

+2

Примите это как ответ, теперь, когда это возможно и что этот ответ подходит к поиску Google. – Metagrapher

39

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

В вашем плавающем фрейме, вы хотите этот IFRAME: SRC = "http://www.example.com/mypage.php"

Ну, вместо HTML, чтобы указать IFRAME, использовать JavaScript для создания HTML-код для фрейма, получить родительский URL через JavaScript «во время сборки», и отправить его в качестве параметра URL GET в строку запроса вашей цели Src, например, так:

<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».

Я нашел большой URL строки парсер здесь: http://www.netlobo.com/url_query_string_javascript.html

+0

Этот ответ в сочетании с http://stackoverflow.com/a/ 7739035/216084 выполняет эту работу. –

+2

Это было замечательное предложение. Для тех, кто пишет родительский код iframe html, это будет foo т законопроекта. Мы использовали что-то очень похожее в нашем программном обеспечении пикселей. – Ligemer

+0

Спасибо! Это эффективная работа, которая по-прежнему соблюдает правила межсайтовых сайтов. – theUtherSide

1

Я не смог получить предыдущее решение для работы, но я обнаружил, что если я установить IFrame ОПЗ с, например, http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder тогда я мог бы, в IFRAME извлечения thisdomain.com/thisfolder с помощью следующей JavaScript:

var myString = document.location.toString(); 
var mySplitResult = myString.split("="); 
fromString = mySplitResult[1]; 
265

Да, URL ACCESSING родительской страницы не допускается, если IFrame и главная страница не в том же (суб) домена. Однако, если вам просто нужно URL главной страницы (то есть браузер URL), вы можете попробовать это:

var url = (window.location != window.parent.location) 
      ? document.referrer 
      : document.location.href; 

Примечание:

window.parent.location допускается; это позволяет избежать ошибки безопасности в ОП, который вызывается при обращении к href собственности: window.parent.location.href причины «Blocked кадр с началом ...»

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

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

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

+0

@ Аш это будет, если окно и расположение родительского окна разные, вы находитесь внутри iframe. В этом случае он принимает реферер iframe. В противном случае это главное окно, поэтому принимает document.location (referrer здесь недействителен, так как это была бы предыдущая страница, а не родительская). – Lumbendil

+1

@jepser, потому что ваш iframe находится внутри этого iframe. у вас никогда не будет доступа к верхнему кадру с тем, что посередине. вложенные междоменные iframes ошибочны на многих уровнях. но вы можете обойти это, если вы установите 'document.domain' на верхний кадр и самый внутренний. может быть. – gcb

+0

Этот ответ в сочетании с http://stackoverflow.com/a/5697801/216084 выполняет эту работу. –

2

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

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

1

Проблема с PHP $ _SERVER ['HTTP_REFFERER'] заключается в том, что он дает полный URL страницы страницы, которая привела вас на родительскую страницу. Это не то же самое, что и родительская страница. Хуже того, иногда нет http_referer, потому что человек напечатал URL-адрес родительской страницы. Итак, если я попаду на вашу родительскую страницу с yahoo.com, тогда yahoo.com станет http_referer, а не вашей страницей.

1

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

22

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

var currentUrl = document.referrer; 

и - вот у вас главный URL!

+0

Это не сработало в моем случае, поскольку я думаю, что сам iFrame был динамически сгенерирован или сделал некоторые другие обманки. Я не получил ответа, которого я ожидал, во всяком случае. – Muskie

+0

это должно работать во всех браузерах. Если в более новых браузерах, если вы отправляете параметры Sandboxing, но я сомневаюсь, что это так. Это работает независимо от перекрестного домена. – gcb

3
var url = (window.location != window.parent.location) ? document.referrer: document.location; 

Я обнаружил, что в приведенном выше примере предложил ранее работал, когда сценарий был быть выполнен в IFRAME, однако это не получить URL-адрес, когда сценарий был выполнен за пределами из фрейма, требуется незначительная корректировка:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href; 
+0

За пределами iframe вам нужно выполнить только 'url = document.location.href' ... – Chococroc

0

Это работало для меня, чтобы получить доступ к URL-адресу iframe src.

window.document.URL 
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; 
Смежные вопросы