Accéder à L'URL du parent à partir d'iframe

d'Accord, j'ai une page et sur cette page j'ai une iframe. Ce que je dois faire est sur la page iframe, trouver ce que L'URL de la page principale est.

j'ai cherché autour et je sais que ce n'est pas possible si ma page iframe est sur un autre domaine, car c'est Cross-Site scripting. Mais partout j'ai lu dit que si la page iframe est sur le même domaine que la page mère, elle devrait fonctionner si je le fais par exemple:

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

... ou en d'autres combos, comme il semble y avoir plusieurs façons d'obtenir les mêmes informations.

de toute façon, voilà le problème. Mon iframe est sur le même domaine que la page principale, mais il n'est pas sur le même SOUS-domaine. Ainsi, par exemple, j'ai

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

et ensuite mon URL iframe est

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

quand j'essaie de saisir L'URL de pageB.html (la page iframe), je continue d'obtenir le même Accès refusé erreur. Il semble donc que même les sous-domaines comptent comme des scripts inter-sites, est-ce correct, Ou Est-ce que je fais quelque chose de mal?

144
demandé sur Diptendu 2010-08-06 03:41:18

14 réponses

vous avez raison. Les sous-domaines sont encore considérés comme des domaines séparés lorsqu'on utilise iframes. Il est possible de transmettre des messages en utilisant postMessage(...) , mais d'autres Jsapis sont intentionnellement rendus inaccessibles.

il est encore possible d'obtenir l'URL en fonction du contexte. Voir d'autres réponses pour plus de détails.

17
répondu Dan Herbert 2017-03-14 22:22:35

Oui, l'accès à L'URL de la page mère n'est pas autorisé si l'iframe et la page principale ne sont pas dans le même (sous)domaine. Cependant, si vous avez juste besoin de L'URL de la page principale (c.-à-d. L'URL du navigateur), vous pouvez essayer ceci:

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

Note:

window.parent.location est autorisé; il évite l'erreur de sécurité dans L'OP, qui est causée par l'accès à la propriété href : window.parent.location.href causes" Bloqué un cadre avec origine..."

document.referrer renvoie à " L'URI de la page qui renvoie à cette page."Cela pourrait pas retour contenant document si une autre source est ce qui a déterminé la iframe emplacement, par exemple:

  • Conteneur iframe @ Domaine 1
  • envoie enfant iframe au domaine 2
  • Mais dans l'enfant iframe... Le domaine 2 redirige vers le domaine 3 (i.e. pour authentification, peut-être SAML), puis le domaine 3 dirige retour vers le domaine 2 (i.e. via form submission (), une technique SAML standard)
  • Pour l'enfant iframe document.referrer sera de Domaine 3 , pas le contenant de Domaine 1

document.location fait référence à "un objet de localisation, qui contient des informations sur L'URL du document"; vraisemblablement le document courant , c'est-à-dire l'iframe actuellement ouvert. Quand window.location === window.parent.location , alors le iframe href est le même que le parent contenant href .

294
répondu Vaibhav 2017-12-26 20:55:29

je viens de découvrir une solution de contournement pour ce problème qui est si simple, et pourtant je n'ai trouvé aucune discussion où que ce soit qui le mentionne. Il nécessite le contrôle du cadre parent.

dans votre iFrame, dites que vous voulez cette iframe: src="http://www.example.com/mypage.php "

Eh bien, au lieu de HTML pour spécifier l'iframe, utiliser un javascript pour construire le HTML pour votre iframe, obtenir l'url parent par javascript "au moment de construire", et l'envoyer comme un url obtenir le paramètre dans le querystring de votre cible src, comme suit:

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

ensuite, trouvez vous une fonction d'analyse d'url javascript qui analyse la chaîne d'url pour obtenir la variable d'url que vous recherchez, dans ce cas c'est "url".

j'ai trouvé un grand analyseur de chaîne d'url ici: http://www.netlobo.com/url_query_string_javascript.html

43
répondu Gregory Lewis 2016-10-28 18:38:36

si votre iframe est d'un autre domaine, (cross domain), vous aurez simplement besoin d'utiliser ceci:

var currentUrl = document.referrer;

et ici vous avez l'url principale!

24
répondu ParPar 2012-10-28 11:42:21

pour les pages sur le même domaine et sous-domaine différent, vous pouvez définir la propriété document.domain via javascript.

tant le cadre parent que l'iframe doivent définir leur document.domaine de quelque chose qui est commun entre eux.

c'est à dire www.foo.mydomain.com et api.foo.mydomain.com pourraient chacun utiliser foo.mydomain.com ou tout simplement mydomain.com et être compatibles (Non, vous ne pouvez pas les mettre tous les deux à com , pour des raisons de sécurité...)

également, notez ce document.domaine est une rue à sens unique. Envisager d'exécuter les trois énoncés suivants dans l'ordre:

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

navigateurs modernes peuvent également utiliser la fenêtre.post-test pour parler des origines, mais ça ne marchera pas dans IE6. https://developer.mozilla.org/en/DOM/window.postMessage

16
répondu user409021 2013-12-09 05:46:54
var url = (window.location != window.parent.location) ? document.referrer: document.location;

j'ai trouvé que l'exemple ci-dessus suggéré précédemment a fonctionné quand le script était exécuté dans une iframe cependant il n'a pas récupérer l'url lorsque le script a été exécuté en dehors d'un iframe, un léger ajustement était nécessaire:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
3
répondu user3523340 2014-04-11 10:49:26

j'ai eu des problèmes avec ça. Si vous utilisez un langage comme php lorsque votre page se charge pour la première fois dans l'iframe, saisissez $_SERVER['HTTP_REFFERER'] et définissez-le à une variable de session.

de cette façon, lorsque la page se charge dans l'iframe, vous connaissez l'url parent complète et la chaîne de requête de la page qui l'a chargée. Avec la sécurité de cross browser c'est un peu un casse-tête en comptant sur la fenêtre.parent n'importe quoi si vous domaines différents.

2
répondu Hyzer Deeds 2012-01-19 21:08:32

Je ne pouvais pas faire fonctionner la solution précédente, mais j'ai découvert que si je mettais le iframe scr avec par exemple http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder alors je pourrais, dans l'extrait d'iframe thisdomain.com/thisfolder en utilisant le javascript suivant:

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];
1
répondu Paul 2011-08-19 08:30:20

le problème avec le PHP $_SERVER['HTTP_REFFERER'] est qu'il donne l'url de page entièrement qualifiée de la page qui vous a amené à la page mère. Ce n'est pas la même chose que la page mère, elle-même. Pire, parfois il n'y a pas de http_referer, parce que la personne a tapé l'url de la page mère. Donc, si j'arrive à votre page parent de yahoo.com, puis yahoo.com devient le http_referer, pas votre page.

1
répondu TARKUS 2012-04-23 14:45:06

j'ai trouvé dans les cas où $_SERVER['HTTP_REFERER'] ne fonctionne pas (je vous regarde, Safari), $_SERVER['REDIRECT_SCRIPT_URI'] a été une sauvegarde utile.

1
répondu Dan 2012-10-23 11:49:13

la ligne suivante fonctionnera: document.location.ancestorOrigins[0] celle-ci renvoie le nom de domaine ancêtre.

1
répondu Robert-Jan Kuyper 2018-09-19 07:02:34

cela a fonctionné pour moi d'accéder à l'url iframe src.

window.document.URL
0
répondu user1503606 2017-10-25 01:38:39

dans chrome il est possible d'utiliser l'emplacement.ascenteursorigines Il retournera toutes les urls parent

0
répondu Gena Moroz 2018-09-05 13:17:07

sortir Tout Parent Iframe fonctions et 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;
-2
répondu vijay kumar 2018-02-26 07:59:10