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?
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.
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:
document.referrer
sera le domaine 3, pas le domaine contenant 1document.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.
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
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!
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
La ligne suivante fonctionnera: document.location.ancestorOrigins[0]
celui-ci renvoie le nom de domaine ancêtre.
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.
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;
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.
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];
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.
En chrome, il est possible d’utiliser location.ancestorOriginsIl renverra toutes les URL parent
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.