Üst URL'ye iframe'den erişin


187

Tamam, üzerinde bir sayfam var ve bu sayfada iframe'im var. Yapmam gereken iframe sayfasında, ana sayfanın URL'sinin ne olduğunu öğrenin.

Etrafımda arama yaptım ve iframe sayfam farklı bir alandaysa, bunun siteler arası komut dosyası olması nedeniyle mümkün olmadığını biliyorum. Ancak okuduğum her yerde, iframe sayfası üst sayfa ile aynı alandaysa, örneğin şunu yapmam gerektiğini söylüyor:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... ya da diğer benzer kombinasyonlar, aynı bilgiyi almanın birden fazla yolu var gibi görünüyor.

Her neyse, sorun burada. İframe'im ana sayfa ile aynı alanda, ancak aynı SUB alanında değil. Mesela bende

http: // www.mysite.com/pageA.html

ve sonra iframe URL'm

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

URL'yi pageB.html(iframe sayfasından) yakalamaya çalıştığımda , aynı erişim reddedildi hatasını alıyorum. Görünüşe göre alt alan adları bile siteler arası komut dosyası olarak sayılıyor, doğru mu yoksa yanlış bir şey mi yapıyorum?


Bunu çerçeve URL'sine aktarabilir misiniz? Mesela<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

Yanıtlar:


21

Haklısın. Alt alanlar, iframe'leri kullanırken yine de ayrı alanlar olarak kabul edilir. Mesajları kullanarak iletmek mümkündür postMessage(...), ancak diğer JS API'lerine kasıtlı olarak erişilemez hale getirilir.

Bağlama bağlı olarak URL'yi almak da mümkündür. Daha fazla ayrıntı için diğer yanıtlara bakın.


1
Tamam, bu sadece esiyor. Ama en azından ben
delirmeyeceğim

9
bu seçilen cevap nasıl? aşağıda olası çözümlerin çok daha iyi açıklamaları bulunmaktadır.
Anoyz

1
Kabul! Aşağıdaki 80 oyla cevap çok daha iyi. Bu cevap html spesifikasyonundadır.
Ligemer

4
2 arasında etkileşim kurabilirsiniz. Ancak hem üst hem de iframe'e şu komut dosyasını eklemelisiniz: <script> document.domain = "etkialanim.com"; </script>
George

2
"Daha fazla ayrıntı için diğer yanıtlara bakın." hahah Şöyle: Hiçbir çözümüm yok, diğer cevapları görüyorum, ama cevabımı da kabul ediyorum.
Milad

371

Evet, iframe ve ana sayfa aynı (alt) etki alanında değilse üst sayfanın URL'sine erişilmesine izin verilmez. Ancak, yalnızca ana sayfanın URL'sine (yani tarayıcı URL'si) ihtiyacınız varsa, bunu deneyebilirsiniz:

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

Not:

window.parent.locationizin verilir; OP'ye, hrefözelliğe erişmenin neden olduğu güvenlik hatasını önler : window.parent.location.href"Orijinli bir çerçeveyi engelledi ..."

document.referrer"bu sayfaya bağlanan sayfanın URI'sini" belirtir. Bu olabilir değil dönmek içeren diğer bazı kaynak belirlenir buysa belgeyi iframeörneğin, konum:

  • Kapsayıcı iframe @ Alan 1
  • Etki Alanı 2'ye alt iframe gönderir
  • Ancak alt iframe'de ... Alan 2, Alan 3'e yönlendirir (yani kimlik doğrulama için, belki SAML için) ve Alan 3, geri yönlendirir Domain 2 (yani yoluyla form gönderme (), standart bir SAML tekniği) ile
  • Çocuk için iframe document.referrerAlan olacaktır 3 değil içeren Domain 1

document.location"belgenin URL'si hakkında bilgi içeren bir Konum nesnesini" belirtir; muhtemelen geçerli belge, yani şu anda açık olan iframe. Ne zaman window.location === window.parent.locationsonra iframe en, hrefolan aynı içeren ebeveyn olduğu gibi href.


1
@jepser, iframe'iniz bu iframe'in içindedir. üstteki kareye asla ortada olan çerçeveye erişemezsiniz. iç içe etki alanları arası iframe'ler pek çok düzeyde yanlıştır. ancak document.domainüst çerçeveye ve en içteki çerçeveye ayarlarsanız , bunu başarabilirsiniz . olabilir.
gcb

2
Veya, biraz daha kompakt bir şekilde:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
Kapsayıcı yerel ana makinenizde bulunuyorsa (veya daha genel olarak, bu sayfa bir web sunucusu tarafından açık değilse) veya file: // ile çağrıldığında bunun çalışmadığını lütfen unutmayın.
Guillaume Renoult

5
Bunun Referer-Policybaşlık ile yenilebileceğine dikkat edilmelidir .
Dan Atkinson

2
Bu Edge tarayıcısı ile çalışmıyor gibi görünüyor - yönlendiren boş bir dize olacak .. stackoverflow.com/questions/24169219/…
Davide Orazio Montersino

51

Bu sorun için bu kadar basit bir çözüm buldum ve bununla ilgili hiçbir yerde herhangi bir tartışma bulamadım. Ana çerçevenin kontrolünü gerektirir.

İFrame'inizde şu iframe'i istediğinizi varsayalım: src = "http://www.example.com/mypage.php"

İframe'i belirtmek için HTML yerine, iframe'iniz için HTML oluşturmak üzere bir javascript kullanın, üst URL'yi "oluşturma zamanında" javascript aracılığıyla alın ve bunu src hedefinizin sorgu dizesinde bir url GET parametresi olarak gönderin. yani:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Ardından, kendinize sonradan olduğunuz url değişkenini almak için url dizesini ayrıştıran bir javascript url ayrıştırma işlevi bulun, bu durumda "url" olur.

Burada harika bir URL dizesi ayrıştırıcı buldum: http://www.netlobo.com/url_query_string_javascript.html


Bu cevap stackoverflow.com/a/7739035/216084 ile birleştirildiğinde iş yapılır.

2
Bu harika bir öneriydi. Üst html iframe kodunu yazanlar için bu faturaya ayak basar. Piksel yazılımımızda çok benzer bir şey kullandık.
Ligemer

Teşekkür ederim!! Bu, siteler arası kurallara hâlâ uyan etkili bir çözümdür.
theUtherSide

Ancak sunucudaki html'deki tüm URL'leri yeniden yazar mısınız? Aksi takdirde, bir kullanıcı iFrame'deki bir bağlantıyı tıklattığında buna erişilemez.
Roel

@ Tümünü sunucu zamanında yazabilirsiniz (özünde, "sabit kod" bu cevap) veya javascript'te yapabileceğiniz bu cevap, örneğin sayfa yüklendikten sonra istenen iframe'leri enjekte eder.
rogerdpack

34

İframe'iniz başka bir alan adından (çapraz alan adı), bunu kullanmanız yeterlidir:

var currentUrl = document.referrer;

ve - burada ana url var!


İFrame'in kendisinin dinamik olarak oluşturulduğunu veya başka bir hile yaptığını düşündüğüm için bu benim durumumda işe yaramadı. Herhangi bir oranda beklediğim cevabı alamadım.
Muskie

bu tüm tarayıcılarda çalışmalıdır. Yeni tarayıcılarda Sandboxing parametreleri gönderirseniz, ancak bu durumdan şüpheliyim. Bu, web alanları arası bağımsız olarak çalışır.
gcb

İframe içindeki sayfa kendini javascript (ör. window.location.reload(true)) İle yeniden yüklediyse, bu artık çalışmaz. Sonra yönlendiren iframe'in kendisinin URL'sidir.
mori

20

Aynı alandaki ve farklı alt alandaki sayfalar için document.domain özelliği javascript yoluyla .

Hem üst çerçevenin hem de iframe'in kendi document.domain öğelerini, aralarında ortak olan bir şeye ayarlaması gerekir.

yani www.foo.mydomain.comve api.foo.mydomain.comher biri ya ya foo.mydomain.comda sadece kullanabilir mydomain.comve uyumlu olabilir (hayır, comgüvenlik nedeniyle ikisini birden ayarlayamazsınız ...)

Ayrıca document.domain'in tek yönlü bir sokak olduğuna dikkat edin. Aşağıdaki üç ifadeyi sırayla çalıştırmayı düşünün:

// 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

Modern tarayıcılar, orijinleri arasında konuşmak için window.postMessage'ı da kullanabilir, ancak IE6'da çalışmaz. https://developer.mozilla.org/en/DOM/window.postMessage


3
Lütfen bunu cevap olarak kabul edin, şimdi bu hem mümkün hem de bu yanıt Google aramalarında geliyor.
Metagrapher

17

Aşağıdaki satır çalışacaktır: document.location.ancestorOrigins[0]bu, ata etki alanı adını döndürür.


Chrome'da yapılan değişikliklerin ardından, bu artık birçok tarayıcı için doğru yanıt.
Dan Atkinson

Tam url olsa olsa. Sadece alan adı
TheMaster

document.location.ancestorOriginsundefinedbenim için döner
Miguel Mota

Tarayıcı desteği ile ilgili olarak, özellikle Temmuz 2020'den itibaren, ancestorOrigins gizlilik endişeleri nedeniyle Firefox'ta henüz desteklenmemektedir. Bugzilla özelliği isteği ve tartışması: bugzilla.mozilla.org/show_bug.cgi?id=1085214 . Tarayıcı desteği: caniuse.com/#search=ancestorOrigins
colin moock


2

Bununla ilgili sorunlar yaşadım. Sayfanız ilk iframe kapısına yüklendiğinde php gibi bir dil kullanıyorsanız$_SERVER['HTTP_REFFERER'] ve bunu bir oturum değişkenine ayarlayın.

Bu şekilde sayfa iframe'e yüklendiğinde, onu yükleyen sayfanın tam üst URL'sini ve sorgu dizesini bilirsiniz. Çapraz tarayıcı güvenliği ile, pencerede sayılan bir baş ağrısından biraz farklı.


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

Yukarıdaki örneğin, komut dosyası bir iframe içinde yürütülürken daha önce çalıştığını önerdim, ancak komut dosyası bir iframe dışında yürütüldüğünde url'yi almadı, hafif bir ayarlama gerekli:

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

2
İframe'in dışındaysanız, komut dosyasını üst çerçevede çalıştırıyorsanız, hiçbir şey kontrol etmeniz gerekmez.
Art3mix

1

Çalışmak için önceki çözüm alamadım ama iframe scr ile örneğin ayarlamak http:otherdomain.com/page.htm?from=thisdomain.com/thisfoldero zaman ben, thisdomain.com/thisfolderjavascript kullanarak iframe özü olabilir ki öğrendim :

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

1

PHP $ _SERVER ['HTTP_REFFERER'] ile ilgili sorun, sizi üst sayfaya getiren sayfanın tam sayfa URL'sini vermesidir. Bu üst sayfanın kendisi ile aynı değil. Daha da kötüsü, bazen http_referer yoktur, çünkü kişi üst sayfanın URL'sini yazmıştır. Dolayısıyla, ana sayfanıza yahoo.com'dan girersem, yahoo.com sayfanız değil http_referer olur.


1

$_SERVER['HTTP_REFERER']İşe yaramadığı durumlarda buldum (Sana bakıyorum, Safari), $_SERVER['REDIRECT_SCRIPT_URI']yararlı bir yedekleme oldu.


0

Chrome'da location.ancestorOrigins kullanmak mümkündür Tüm üst URL'leri döndürür


0

Onun süper eski olduğunu biliyorum ama kimse sadece bir alandan diğerine çerezleri geçmesini tavsiye aklımdan darbeler. Alt etki alanlarını kullandığınız için, çerezleri yalnızca URL'ye ayarlayarak temel alan adından tüm alt etki alanlarına çerezleri paylaşabilirsiniz.basedomain.com

Ardından, ihtiyacınız olan verileri çerezler aracılığıyla paylaşabilirsiniz.


-1

Bu, iframe src url'sine erişmem için çalıştı.

window.document.URL

-4

Tüm Üst Iframe işlevlerini ve HTML'yi edinin

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;

Bu cevabı jQuery kullanmayanlarımız için genişletebileceğinizi düşünmüyorum (jQuery son birkaç yılda gereksiz hale geldiğinden, giderek artan bir sayıya dikkat etmeliyim). En azından, bu cevabın jQuery'ye bağlı olduğunu ve OP'nin jQuery'den hiç bahsetmediğini açıkça belirtmeyi öneriyorum.
Carnix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.