web-dev-qa-db-fra.com

Accéder à l'URL parent à partir d'iframe

D'accord, j'ai une page sur et sur cette page, j'ai un iframe. Ce que je dois faire, c'est sur la page iframe, trouver quelle est l'URL de la page principale. 

J'ai effectué des recherches et je sais que ce n'est pas possible si ma page d'iframe se trouve sur un domaine différent, car il s'agit d'un script intersite. Mais partout où j'ai lu, je peux dire que si la page iframe se trouve sur le même domaine que la page parent, cela devrait fonctionner si je le fais par exemple

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

... ou d'autres combinaisons similaires, car il semble y avoir plusieurs façons d'obtenir les mêmes informations. 

Quoi qu'il en soit, voici le problème. Mon iframe se trouve sur le même domaine que la page principale, mais pas sur le même sous-domaine. Donc, par exemple, j'ai

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

et puis mon URL iframe est 

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

Lorsque j'essaie de récupérer l'URL de pageB.html (la page iframe), j'obtiens toujours le même message d'erreur d'accès refusé. Il semble donc que même les sous-domaines comptent comme des scripts intersites, est-ce exact ou est-ce que je fais quelque chose de mal?

153
chronofwar

Vous avez raison. Les sous-domaines sont toujours considérés comme des domaines distincts lors de l'utilisation d'iframes. Il est possible de transmettre des messages à l'aide de postMessage(...) , mais d'autres API JS sont rendues intentionnellement inaccessibles.

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

19
Dan Herbert

Oui, l'accès à l'URL de la page parent 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'est-à-dire l'URL du navigateur), vous pouvez essayer ceci:

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

Remarque:

window.parent.location est autorisé; cela évite l'erreur de sécurité dans l'OP, provoquée par l'accès à la propriété href: window.parent.location.href provoque "Blocage d'une image avec l'origine ..."

document.referrer fait référence à "l'URI de la page liée à cette page". Ceci peut pas renvoyer le document contenant si une autre source est ce qui a déterminé l'emplacement iframe, par exemple:

  • Conteneur iframe @ Domaine 1
  • Envoie l'enfant iframe au domaine 2
  • Mais dans l’enfant iframe ... le domaine 2 redirige vers le domaine 3 (par exemple pour l’authentification, peut-être SAML), puis le domaine 3 dirige retour vers le domaine 2 (via la soumission de formulaire (), une technique SAML standard )
  • Pour l’enfant iframe, le document.referrer sera le domaine 3, pas le domaine contenant 1

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

307
Vaibhav

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

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

Au lieu d'utiliser HTML pour spécifier l'iframe, utilisez un javascript pour construire le code HTML de votre iframe, récupérez l'URL parent via javascript "au moment de la construction" et envoyez-le sous forme de paramètre GET dans la chaîne de requête de votre cible src, comme alors:

<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 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 excellent analyseur de chaînes d'URL ici: http://www.netlobo.com/url_query_string_javascript.html

45
Gregory Lewis

Si votre iframe provient d'un autre domaine (cross domain), vous devrez simplement utiliser ceci:

var currentUrl = document.referrer;

et - ici vous avez l'URL principale!

27
ParPar

Pour les pages du même domaine et de sous-domaines différents, vous pouvez définir la propriété document.domain via javascript.

Les cadres parent et iframe doivent définir leur document.domain sur quelque chose qui leur est commun.

i.e .www.foo.mydomain.com et api.foo.mydomain.com pourraient utiliser chacun foo.mydomain.com ou simplement mydomain.com et être compatibles (non, vous ne pouvez pas les définir tous les deux sur com, pour des raisons de sécurité ...)

notez également que document.domain est une rue à sens unique. Envisagez de lancer les trois instructions suivantes 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

Les navigateurs modernes peuvent également utiliser window.postMessage pour parler entre les origines, mais cela ne fonctionnera pas dans IE6 . https://developer.mozilla.org/en/DOM/window.postMessage

16
user409021

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

3
Robert-Jan Kuyper

Essayez le:

document.referrer

Lorsque vous changez de profil, vous êtes dans un iframe, votre hôte est "référent".

J'ai eu des problèmes avec cela. Si vous utilisez un langage tel que php lorsque votre page est chargée pour la première fois dans l'iframe grab $_SERVER['HTTP_REFFERER'] et la définir comme variable de session.

Ainsi, 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é inter-navigateurs, c’est un peu un casse-tête de compter sur window.parent, que ce soit si vous possédez des domaines différents.

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

J'ai trouvé que l'exemple ci-dessus suggéré fonctionnait précédemment lorsque le script était exécuté dans un iframe, mais qu'il ne récupérait pas l'URL. Lorsque le script était 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;
2
user3523340

Le problème avec PHP $ _SERVER ['HTTP_REFFERER'] est qu’il donne l’URL de la page qualifiée complète de la page qui vous a amené à la page parent. Ce n'est pas la même chose que la page parent elle-même. Pire, il n’ya parfois pas de http_referer, car la personne a tapé dans l’url de la page parente. Donc, si j'arrive sur votre page parent à partir de yahoo.com, yahoo.com devient alors le http_referer, pas votre page.

1
TARKUS

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

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

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
Dan

En chrome, il est possible d’utiliser location.ancestorOriginsIl renverra toutes les URL parent 

0
Gena Moroz

Je sais que le sien est super vieux mais personne ne m'a recommandé de simplement passer des cookies d'un domaine à un autre. Lorsque vous utilisez des sous-domaines, vous pouvez partager des cookies d’un domaine de base avec tous les sous-domaines, simplement en définissant des cookies sur l’URL .basedomain.com.

Ensuite, vous pouvez partager toutes les données dont vous avez besoin par le biais des cookies.

0
Bruce