Iframe से अभिभावक URL पर पहुँचें


187

ठीक है, मेरे पास एक पृष्ठ है और इस पृष्ठ पर मेरा एक iframe है। मुझे iframe पेज पर क्या करना है, यह पता करें कि मुख्य पृष्ठ का URL क्या है।

मैंने आसपास खोज की है और मुझे पता है कि यह संभव नहीं है अगर मेरा आइफ्रेम पेज एक अलग डोमेन पर है, क्योंकि यह क्रॉस-साइट स्क्रिप्टिंग है। लेकिन हर जगह मैंने पढ़ा है कि अगर 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>
बिआगिओ अरोबा

जवाबों:


21

तुम सही हो। Iframes का उपयोग करते समय उप डोमेन को अलग डोमेन माना जाता है। संदेशों का उपयोग करके पास करना संभव है postMessage(...), लेकिन अन्य जेएस एपीआई जानबूझकर दुर्गम बना दिए जाते हैं।

संदर्भ के आधार पर URL प्राप्त करना अभी भी संभव है। अधिक विवरण के लिए अन्य उत्तर देखें।


1
ठीक है कि बस चल रही है। लेकिन कम से कम मुझे पता है कि मैं पागल नहीं हो रहा हूँ :( आह अच्छी तरह से, प्लान बी धन्यवाद। (और टैग में अपना सामान नहीं डालने के लिए खेद है, संपादन के लिए धन्यवाद)
chronofwar

9
यह चयनित उत्तर कैसे हो सकता है? नीचे दिए गए संभावित समाधानों के बहुत बेहतर वर्णन हैं।
एनवायज

1
माना! 80 वोटों के साथ नीचे का जवाब ज्यादा बेहतर है। यह उत्तर html कल्पना में है।
1

4
आप के बीच बातचीत कर सकते हैं 2. लेकिन आपको माता-पिता और iframe दोनों पर निम्न स्क्रिप्ट जोड़ना होगा: <script> document.domain = "mydomain.com"; </ script>
जॉर्ज

2
"अधिक विवरण के लिए अन्य उत्तर देखें।" हाहा यह ऐसा है: मेरे पास कोई हल नहीं है, अन्य उत्तर देखें, लेकिन मेरे उत्तर को भी स्वीकार करें।
मिलाद

371

हां, यदि iframe और मुख्य पृष्ठ समान (उप) डोमेन में नहीं हैं, तो पैरेंट पेज के URL तक पहुंचने की अनुमति नहीं है। हालाँकि, यदि आपको मुख्य पृष्ठ (यानी ब्राउज़र URL) के URL की आवश्यकता है, तो आप यह कोशिश कर सकते हैं:

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

ध्यान दें:

window.parent.locationकी अनुमति है; यह ओपी में सुरक्षा त्रुटि से बचा जाता है, जो hrefसंपत्ति तक पहुंचने के कारण होता है : window.parent.location.href"मूल के साथ एक फ्रेम को अवरुद्ध ..."

document.referrer"पेज का यूआरआई जो इस पेज से जुड़ा हुआ है।" यह हो सकता है नहीं लौटने युक्त दस्तावेज यदि किसी अन्य स्रोत क्या निर्धारित है iframe, स्थान उदाहरण के लिए:

  • कंटेनर iframe @ डोमेन 1
  • डोमेन 2 के लिए संतान iframe भेजता है
  • लेकिन बच्चे में iframe ... डोमेन 2 डोमेन 3 (यानी प्रमाणीकरण, शायद एसएएमएल के लिए) को पुनर्निर्देशित करता है, और फिर डोमेन 3 डोमेन 2 (यानी फार्म जमा करने के माध्यम से), एक मानक एसएएमएल तकनीक पर वापस निर्देशित करता है
  • बच्चे के लिए iframe document.referrerडोमेन 3 होगा , जिसमें डोमेन 1 शामिल नहीं होगा

document.location"एक स्थान ऑब्जेक्ट, जिसमें दस्तावेज़ के URL के बारे में जानकारी शामिल है" को संदर्भित करता है; संभवतः वर्तमान दस्तावेज़, अर्थात, वर्तमान में खुला iframe। जब window.location === window.parent.location, तो आइफ्रेम का hrefहै एक ही युक्त माता पिता के रूप में href


1
@jepser ऐसा इसलिए है क्योंकि आपका iframe उस iframe के अंदर है। आप बीच में उस एक के साथ शीर्ष फ्रेम तक कभी नहीं पहुंच पाएंगे। नेस्टेड क्रॉस डोमेन iframes इतने सारे स्तरों पर गलत है। लेकिन अगर आप document.domainशीर्ष फ्रेम और आंतरिक-सबसे पर सेट करते हैं, तो आप इसे प्राप्त करने में सक्षम हो सकते हैं । शायद।
जीसीबी

2
या, थोड़ा और अधिक:var url = (parent !== window) ? document.referrer : document.location;
akingoftruth

2
कृपया ध्यान दें कि यदि कंटेनर आपके लोकलहोस्ट पर स्थित है (या आम तौर पर, यदि यह पृष्ठ किसी वेब सर्वर द्वारा नहीं खुला है) या फ़ाइल: // के द्वारा काम करता है।
गिलियूम रेनॉल्ट

5
यह ध्यान दिया जाना चाहिए कि यह Referer-Policyहेडर के साथ हराया जा सकता है ।
दान एटकिन्सन

2
यह एज ब्राउज़र के साथ काम नहीं करता है - संदर्भकर्ता एक खाली स्ट्रिंग होगा .. stackoverflow.com/questions/24169219/…
Davide Orazio Montersino

51

मैंने अभी इस समस्या के लिए एक वर्कअराउंड की खोज की है जो इतना सरल है, और फिर भी मुझे कहीं भी कोई चर्चा नहीं मिली है जो इसका उल्लेख करती है। यह मूल फ्रेम के नियंत्रण की आवश्यकता है।

अपने iFrame में, कहें कि आप यह iframe चाहते हैं: src = "http://www.example.com/mypage.php"

खैर, iframe निर्दिष्ट करने के लिए HTML के बजाय, अपने iframe के लिए HTML बनाने के लिए एक जावास्क्रिप्ट का उपयोग करें, "समय पर निर्माण" पर जावास्क्रिप्ट के माध्यम से मूल यूआरएल प्राप्त करें, और इसे अपने src लक्ष्य के querystring में url GET पैरामीटर के रूप में भेजें, जैसे इसलिए:

<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


इस जवाब के साथ संयुक्त stackoverflow.com/a/7739035/216084 काम हो जाता है।

2
यह एक अद्भुत सुझाव था। जो माता-पिता html iframe कोड लिख रहे हैं, उनके लिए यह बिल फुट जाएगा। हमने अपने पिक्सेल सॉफ्टवेयर में कुछ इसी तरह का उपयोग किया।
Ligemer

धन्यवाद!! यह एक प्रभावी कार्य है, जो अभी भी क्रॉस-साइट नियमों का सम्मान करता है।
22

लेकिन क्या आप सर्वर के html में सभी url को फिर से लिखते हैं? क्योंकि अन्यथा जब कोई उपयोगकर्ता iFrame में एक लिंक पर क्लिक करता है तब भी यह एक्सेस करने योग्य नहीं होगा।
Roel

@ यदि आप उन सभी को सर्वर समय (संक्षेप में, "हार्ड कोड" इस उत्तर) में लिख सकते हैं, या यह उत्तर आप जावास्क्रिप्ट में कर सकते हैं, उदाहरण के लिए पेज लोड होने के बाद यह वांछित iframes को इंजेक्ट करता है।
रोजरपैक

34

यदि आपका आइफ्रेम किसी अन्य डोमेन, (क्रॉस डोमेन) से है, तो आपको बस इसका उपयोग करने की आवश्यकता होगी:

var currentUrl = document.referrer;

और - यहाँ आपको मुख्य यूआरएल मिला है!


मेरे मामले में यह काम नहीं किया क्योंकि मुझे लगता है कि iFrame ही गतिशील रूप से उत्पन्न हुआ है या कुछ अन्य चालबाजी किया है। मुझे वह जवाब नहीं मिला जिसकी मुझे किसी भी दर से उम्मीद थी।
मुस्की जू

यह सभी ब्राउज़रों में काम करना चाहिए। यदि आप सैंडबॉक्सिंग मापदंडों को भेजते हैं, तो नए ब्राउज़रों में नहीं, लेकिन मुझे संदेह है कि यह मामला है। यह क्रॉस डोमेन की परवाह किए बिना काम करता है।
जीसीबी

यदि आइफ्रेम के अंदर का पेज जावास्क्रिप्ट (जैसे window.location.reload(true)) के माध्यम से खुद को पुनः लोड करता है, तो यह अब काम नहीं करता है। फिर रेफरर आईफ्रेम का URL है।
मोरी

20

एक ही डोमेन और विभिन्न उप-डोमेन पर पृष्ठों के लिए, आप document.domainजावास्क्रिप्ट के माध्यम से संपत्ति सेट कर सकते हैं।

माता-पिता फ्रेम और iframe दोनों को अपने डॉक्यूमेंट को सेट करने की आवश्यकता होती है। कुछ ऐसा है जो उन्हें आम है।

यानी 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


3
कृपया इसे उत्तर के रूप में स्वीकार करें, अब यह दोनों संभव है और यह उत्तर Google खोजों में आ रहा है।
पैराग्राफर

17

निम्न पंक्ति काम करेगी: document.location.ancestorOrigins[0]यह पूर्वज डोमेन नाम लौटाती है।


Chrome में किए गए परिवर्तनों के बाद, यह अब बहुत सारे ब्राउज़रों के लिए सही उत्तर है।
दान एटकिन्सन

हालांकि पूर्ण url नहीं है। केवल डोमेन
TheMaster

document.location.ancestorOriginsundefinedमेरे लिए रिटर्न
मिगुएल मोटा

ब्राउज़र समर्थन के बारे में, विशेष रूप से, जुलाई 2020 तक, पूर्वजऑरिजिन गोपनीयता चिंताओं के कारण फ़ायरफ़ॉक्स में अभी तक समर्थित नहीं हैं। Bugzilla सुविधा अनुरोध और चर्चा: Bugzilla.mozilla.org/show_bug.cgi?id=1085214 । ब्राउज़र का समर्थन: caniuse.com/#search=ancestorOrigins
colin moock


2

मैं इस के साथ मुद्दों था। अगर आपके पेज पर iframe हड़पने में php जैसी भाषा का उपयोग किया जाता है$_SERVER['HTTP_REFFERER'] और इसे सत्र चर में सेट किया जाता है।

इस तरह से जब पेज iframe में लोड होता है तो आप उस पेज को लोड करने वाले पेज के पूर्ण मूल यूआरएल और क्वेरी स्ट्रिंग को जानते हैं। क्रॉस ब्राउजर सिक्योरिटी के साथ यह विंडो सिरदर्द की एक छोटी सी गिनती है। यदि आप अलग-अलग डोमेन रखते हैं तो कुछ भी।


2
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
यदि आप iframe के बाहर हैं तो आप स्क्रिप्ट को पैरेंट फ़्रेम पर चला रहे हैं, तो आपको कुछ भी जाँचने की आवश्यकता नहीं है।
आर्ट

1

मैं काम करने के लिए पिछले समाधान प्राप्त नहीं कर सका, लेकिन मुझे पता चला कि अगर मैंने उदाहरण के लिए iframe स्क्रब सेट किया है http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder, तो मैं thisdomain.com/thisfolderनिम्नलिखित जावास्क्रिप्ट का उपयोग करके iframe अर्क में कर सकता हूं :

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

1

PHP $ _SERVER ['HTTP_REFFERER'] के साथ समस्या यह है कि यह पृष्ठ का पूर्ण रूप से योग्य पृष्ठ url देता है जो आपको मूल पृष्ठ पर लाया है। यह मूल पृष्ठ के समान नहीं है, स्वयं। इससे भी बदतर, कभी-कभी कोई http_referer नहीं होता है, क्योंकि व्यक्ति मूल पृष्ठ के यूआरएल में टाइप करता है। इसलिए, अगर मैं yahoo.com से आपके मूल पृष्ठ पर जाता हूं, तो yahoo.com आपके पृष्ठ का नहीं, http_referer बन जाता है।


1

मैंने उन मामलों में पाया है जहां $_SERVER['HTTP_REFERER']काम नहीं करता है (मैं आपको देख रहा हूं, सफारी), $_SERVER['REDIRECT_SCRIPT_URI']एक उपयोगी बैकअप रहा है।


0

क्रोम में location.ancestorOrigins का उपयोग करना संभव है। यह सभी माता-पिता के यूआरएल को वापस कर देगा


0

मुझे पता है कि वह सुपर बूढ़ा है, लेकिन यह मेरे दिमाग को उड़ा देता है कि किसी को सिर्फ एक डोमेन से दूसरे में कुकीज़ पास करने की सिफारिश नहीं की जाती है। जैसा कि आप सबडोमेन का उपयोग कर रहे हैं, आप कुकीज़ को बेस पर सेट करके केवल यूआरएल के लिए एक बेस डोमेन से सभी सबडोमेन तक कुकीज़ साझा कर सकते हैं.basedomain.com

फिर आप कुकीज़ के माध्यम से आपको जो भी डेटा की आवश्यकता हो उसे साझा कर सकते हैं।


-1

यह मेरे लिए iframe src url का उपयोग करने के लिए काम करता है।

window.document.URL

-4

सभी जनक 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;

मुझे नहीं लगता कि आप हम में से उन लोगों के लिए इस उत्तर का विस्तार कर सकते हैं जो jQuery का उपयोग नहीं करते हैं (एक बढ़ती संख्या, मुझे इंगित करना चाहिए, क्योंकि jQuery पिछले कुछ वर्षों में अनावश्यक बढ़ गया है)। बहुत कम से कम, मैं यह स्पष्ट करने का सुझाव देता हूं कि यह उत्तर jQuery पर निर्भर है और OP ने jQuery का उल्लेख नहीं किया है।
कार्निक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.