Accedi all'URL principale da iframe


187

Ok, ho una pagina su e su questa pagina ho un iframe. Quello che devo fare è sulla pagina iframe, scoprire qual è l'URL della pagina principale.

Ho cercato in giro e so che questo non è possibile se la mia pagina iframe si trova su un dominio diverso, poiché si tratta di scripting cross-site. Ma ovunque ho letto dice che se la pagina iframe si trova sullo stesso dominio della pagina padre, dovrebbe funzionare se lo faccio per esempio:

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

... o altre combinazioni simili, poiché sembrano esserci più modi per ottenere le stesse informazioni.

Comunque, ecco il problema. Il mio iframe si trova sullo stesso dominio della pagina principale, ma non si trova sullo stesso dominio SUB. Quindi per esempio ho

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

e quindi il mio URL iframe è

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

Quando provo a prendere l'URL dalla pageB.html(pagina iframe), continuo a ricevere lo stesso errore di accesso negato. Quindi sembra che anche i sottodomini contino come script tra siti, è corretto o sto facendo qualcosa di sbagliato?


Puoi semplicemente passarlo nell'URL del frame? Come ad esempio<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba il

Risposte:


21

Hai ragione. I sottodomini sono ancora considerati domini separati quando si utilizzano iframe. È possibile passare messaggi utilizzando postMessage(...), ma altre API JS sono rese intenzionalmente inaccessibili.

È anche possibile ottenere l'URL in base al contesto. Vedi altre risposte per maggiori dettagli.


1
Va bene bene che soffia. Ma almeno so che non impazzirò :( ah bene, piano B. grazie. (E scusa per non aver messo le mie cose nei tag, grazie per la modifica)
chronofwar

9
come è questa la risposta selezionata? di seguito sono riportate descrizioni molto migliori delle possibili soluzioni.
Anoyz

1
Concordato! La risposta di seguito con 80 voti è molto migliore. Questa risposta è nelle specifiche html.
Ligemer,

4
puoi interagire tra i 2. Ma devi aggiungere il seguente script sia su parent che su iframe: <script> document.domain = "mydomain.com"; </script>
George

2
"Vedi altre risposte per maggiori dettagli." hahah È come: non ho alcuna soluzione, vedi altre risposte, ma accetto anche la mia risposta.
Milad,

371

Sì, l'accesso all'URL della pagina principale non è consentito se iframe e la pagina principale non si trovano nello stesso (sotto) dominio. Tuttavia, se hai solo bisogno dell'URL della pagina principale (cioè l'URL del browser), puoi provare questo:

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

Nota:

window.parent.locationÈ permesso; evita l'errore di sicurezza nell'OP, causato dall'accesso alla hrefproprietà: window.parent.location.hrefcausa "Blocco di un frame con origine ..."

document.referrerfa riferimento a "l'URI della pagina collegata a questa pagina". Questo potrebbe non restituire il documento contenente se qualche altra fonte è ciò che ha determinato la iframeposizione, ad esempio:

  • Contenitore iframe @ Dominio 1
  • Invia iframe figlio al dominio 2
  • Ma nel iframe figlio ... Il dominio 2 reindirizza al dominio 3 (vale a dire per l'autenticazione, forse SAML), e quindi il dominio 3 torna al dominio 2 (cioè tramite l'invio di moduli (), una tecnica SAML standard)
  • Per l'iframe figlio document.referrersarà il dominio 3 , non il dominio 1 contenente

document.locationfa riferimento a "un oggetto Location, che contiene informazioni sull'URL del documento"; presumibilmente il documento corrente , ovvero l'iframe attualmente aperto. Quando window.location === window.parent.location, allora l'iframe hrefè uguale al genitore contenente href.


1
@jepser è perché il tuo iframe è dentro quell'iframe. non avrai mai accesso al frame superiore con quello al centro. iframe tra domini nidificati è errato su così tanti livelli. ma potresti essere in grado di aggirare ciò se ti posizioni document.domainsul riquadro superiore e su quello più interno. può essere.
CG

2
O, leggermente più compatto:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth,

2
Si noti che non funziona se il contenitore si trova sul localhost (o più in generale, se questa pagina non è aperta da un server Web) o chiamato da file: //.
Guillaume Renoult,

5
Va notato che questo può essere sconfitto con l' Referer-Policyintestazione.
Dan Atkinson,

2
Questo non sembra funzionare con il browser Edge - il referrer sarà una stringa vuota .. stackoverflow.com/questions/24169219/…
Davide Orazio Montersino

52

Ho appena scoperto una soluzione alternativa per questo problema che è così semplice, eppure non ho trovato alcuna discussione da nessuna parte che lo menzioni. Richiede il controllo del frame principale.

Nel tuo iFrame, supponi di volere questo iframe: src = "http://www.example.com/mypage.php"

Bene, invece di HTML per specificare l'iframe, usa un javascript per creare l'HTML per il tuo iframe, ottieni l'URL principale tramite javascript "al momento della compilazione" e invialo come parametro GET url nella stringa di query del tuo target src, come così:

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

Quindi, trova te stesso una funzione di analisi dell'URL javascript che analizza la stringa dell'URL per ottenere la variabile url che stai cercando, in questo caso è "url".

Ho trovato un ottimo parser di stringhe URL qui: http://www.netlobo.com/url_query_string_javascript.html


Questa risposta combinata con stackoverflow.com/a/7739035/216084 porta a termine il lavoro.

2
Questo è stato un suggerimento meraviglioso. Per coloro che stanno scrivendo il codice iframe html genitore questo dovrebbe pagare il conto. Abbiamo usato qualcosa di molto simile nel nostro software pixel.
Ligemer,

Grazie!! Si tratta di una soluzione efficace che rispetta ancora le regole tra siti.
theUtherSide

Ma riscrivi tutti gli URL nell'html sul server? Perché altrimenti quando un utente fa clic su un collegamento nell'iFrame non sarà ancora accessibile.
Roel,

@Roel potresti scriverli tutti al momento del server (in sostanza, "hard code" questa risposta), o questa risposta che potresti fare in javascript, ad esempio dopo che la pagina si carica inietta gli iframe desiderati.
rogerdpack,

34

Se il tuo iframe proviene da un altro dominio (interdominio), dovrai semplicemente usare questo:

var currentUrl = document.referrer;

e - qui hai l'URL principale!


Ciò non ha funzionato nel mio caso poiché penso che l'iFrame stesso sia stato generato dinamicamente o abbia fatto qualche altro trucco. Non ho ricevuto la risposta che mi aspettavo in ogni caso.
Muskie,

questo dovrebbe funzionare in tutti i browser. A meno che nei browser più recenti, se si inviano parametri Sandboxing, ma dubito che sia così. Funziona indipendentemente dal dominio incrociato.
CG

Se la pagina all'interno dell'iframe si è ricaricata tramite javascript (ad es. window.location.reload(true)) Non funziona più. Quindi referrer è l'URL dell'iframe stesso.
mori,

20

Per le pagine sullo stesso dominio e sottodominio diverso, è possibile impostare il document.domain proprietà tramite javascript.

Sia il frame principale che l'iframe devono impostare il loro document.domain su qualcosa che è comune tra loro.

cioè www.foo.mydomain.come api.foo.mydomain.comciascuno potrebbe usare uno foo.mydomain.como solo mydomain.comed essere compatibile (no, non è possibile impostarli entrambi com, per motivi di sicurezza ...)

inoltre, nota che document.domain è una strada a senso unico. Valuta di eseguire le tre istruzioni seguenti in ordine:

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

I browser moderni possono anche usare window.postMessage per parlare attraverso le origini, ma non funzionerà in IE6. https://developer.mozilla.org/en/DOM/window.postMessage


3
Accetta questa come risposta, ora che sia possibile e che questa risposta è presente nelle ricerche di Google.
Metagrafo

17

La seguente riga funzionerà: document.location.ancestorOrigins[0]questa restituisce il nome di dominio dell'antenato.


A seguito delle modifiche apportate a Chrome, questa è ora la risposta corretta per molti browser.
Dan Atkinson,

Tuttavia, non l'URL completo. Solo il dominio
TheMaster il

document.location.ancestorOriginsritorna undefinedper me
Miguel Mota

Per quanto riguarda il supporto del browser, in particolare, a partire da luglio 2020, ancestorOrigins non è ancora supportato in Firefox a causa di problemi di privacy. Richiesta e discussione sulla funzione Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=1085214 . Supporto per browser: caniuse.com/#search=ancestorOrigins
colin moock


2

Ho avuto problemi con questo. Se usi una lingua come php quando la tua pagina viene caricata per la prima volta nell'afferrare iframe$_SERVER['HTTP_REFFERER'] e impostala su una variabile di sessione.

In questo modo quando la pagina viene caricata nell'iframe si conosce l'URL principale completo e la stringa di query della pagina che l'ha caricata. Con la sicurezza cross browser è un po 'un mal di testa contare su window.parent qualsiasi cosa se si hanno domini diversi.


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

Ho scoperto che l'esempio sopra suggerito precedentemente funzionava quando lo script veniva eseguito in un iframe ma non recuperava l'URL quando lo script veniva eseguito al di fuori di un iframe, era necessaria una leggera regolazione:

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

2
Se sei all'esterno dell'iframe, stai eseguendo lo script sul frame principale, non è necessario controllare nulla.
Art3mix,

1

Non sono riuscito a far funzionare la soluzione precedente ma ho scoperto che se avessi impostato iframe scr con, ad esempio, http:otherdomain.com/page.htm?from=thisdomain.com/thisfolderavrei potuto, nell'estratto iframe, thisdomain.com/thisfolderutilizzare il seguente javascript:

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

1

Il problema con PHP $ _SERVER ['HTTP_REFFERER'] è che fornisce l'URL di pagina completo della pagina che ti ha portato alla pagina principale. Non è la stessa della pagina principale, in sé. Peggio ancora, a volte non esiste un http_referer, perché la persona ha digitato l'URL della pagina principale. Quindi, se arrivo alla tua pagina principale da yahoo.com, allora yahoo.com diventa il http_referer, non la tua pagina.


1

Ho trovato nei casi in cui $_SERVER['HTTP_REFERER']non funziona (ti sto guardando, Safari), $_SERVER['REDIRECT_SCRIPT_URI']è stato un backup utile.


0

In Chrome è possibile utilizzare location.ancestorOrigins Restituirà tutti gli URL principali


0

So che è super vecchio ma mi fa impazzire nessuno mi ha consigliato di passare i cookie da un dominio all'altro. Mentre stai usando i sottodomini puoi condividere i cookie da un dominio di base a tutti i sottodomini semplicemente impostando i cookie sull'URL.basedomain.com

Quindi puoi condividere tutti i dati di cui hai bisogno attraverso i cookie.


-1

Questo ha funzionato per me per accedere all'URL iframe src.

window.document.URL

-4

Ottieni tutte le funzioni Iframe padre e 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;

Suppongo che non puoi espandere questa risposta per quelli di noi che non usano jQuery (un numero crescente, dovrei sottolineare, dal momento che jQuery è diventato sempre più inutile negli ultimi anni). Per lo meno, suggerisco di chiarire che questa risposta dipende da jQuery e l'OP non ha menzionato affatto jQuery.
Carnix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.