Bien, tengo una página y en esta página tengo un iframe. Lo que necesito hacer es en la página del iframe, averiguar cuál es la URL de la página principal.
He buscado y sé que esto no es posible si mi página de iframe está en un dominio diferente, ya que es una secuencia de comandos entre sitios. Pero en todas partes que he leído dice que si la página del iframe está en el mismo dominio que la página principal, debería funcionar si lo hago, por ejemplo:
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href
... u otros combos similares, ya que parece haber múltiples formas de obtener la misma información.
De todos modos, aquí está el problema. Mi iframe está en el mismo dominio que la página principal, pero no está en el mismo dominio SUB. Entonces por ejemplo tengo
http: // www.mysite.com/pageA.html
y luego mi URL de iframe es
http: // qa-www.mysite.com/pageB.html
Cuando intento obtener la URL de pageB.html
(la página del iframe), sigo recibiendo el mismo error de acceso denegado. Entonces, parece que incluso los subdominios cuentan como secuencias de comandos entre sitios, ¿es correcto o estoy haciendo algo mal?
fuente
<iframe src="url?parent=parent-url"></iframe>
Respuestas:
Estás en lo correcto. Los subdominios todavía se consideran dominios separados cuando se usan iframes. Es posible pasar mensajes usando
postMessage(...)
, pero otras API de JS se hacen inaccesibles intencionalmente.También es posible obtener la URL según el contexto. Ver otras respuestas para más detalles.
fuente
Sí, no está permitido acceder a la URL de la página principal si el iframe y la página principal no están en el mismo (sub) dominio. Sin embargo, si solo necesita la URL de la página principal (es decir, la URL del navegador), puede intentar esto:
Nota:
window.parent.location
esta permitido; evita el error de seguridad en el OP, que es causado por el acceso a lahref
propiedad:window.parent.location.href
provoca "Bloqueado un marco con origen ..."document.referrer
se refiere a "el URI de la página que se vinculó a esta página". Esto puede no devolver el documento que contiene si alguna otra fuente es lo que determinó laiframe
ubicación, por ejemplo:document.referrer
, será el Dominio 3 , no el Dominio que lo contiene 1document.location
se refiere a "un objeto de ubicación, que contiene información sobre la URL del documento"; presumiblemente el documento actual , es decir, el iframe actualmente abierto. Cuandowindow.location === window.parent.location
, entonces el iframehref
es el mismo que el del padre que lo contienehref
.fuente
document.domain
el marco superior y el más interno. tal vez.var url = (parent !== window) ? document.referrer : document.location;
Referer-Policy
encabezado.Acabo de descubrir una solución para este problema que es tan simple y, sin embargo, no he encontrado ninguna discusión que lo mencione. Requiere el control del marco principal.
En su iFrame, diga que quiere este iframe: src = "http://www.example.com/mypage.php"
Bueno, en lugar de HTML para especificar el iframe, use un javascript para construir el HTML para su iframe, obtenga la URL principal a través de javascript "en el momento de la compilación" y envíela como un parámetro GET de url en la cadena de consulta de su objetivo src, como entonces:
Luego, encuentre una función de análisis de URL de JavaScript que analice la cadena de URL para obtener la variable de URL que busca, en este caso es "url".
Encontré un excelente analizador de cadenas de URL aquí: http://www.netlobo.com/url_query_string_javascript.html
fuente
Si su iframe es de otro dominio, (dominio cruzado), simplemente necesitará usar esto:
y - aquí tienes la url principal!
fuente
window.location.reload(true)
), esto ya no funciona. Entonces el referente es la URL del propio iframe.Para páginas en el mismo dominio y subdominio diferente, puede establecer la
document.domain
propiedad a través de javascript.Tanto el marco principal como el iframe deben establecer su document.domain en algo que sea común entre ellos.
es decir,
www.foo.mydomain.com
yapi.foo.mydomain.com
cada uno podría usar unofoo.mydomain.com
o solomydomain.com
y ser compatible (no, no puede configurarlos a amboscom
, por razones de seguridad ...)Además, tenga en cuenta que document.domain es una calle de sentido único. Considere ejecutar las siguientes tres declaraciones en orden:
Los navegadores modernos también pueden usar window.postMessage para hablar entre orígenes, pero no funcionará en IE6. https://developer.mozilla.org/en/DOM/window.postMessage
fuente
La siguiente línea funcionará:
document.location.ancestorOrigins[0]
esta devuelve el nombre del dominio ancestro.fuente
document.location.ancestorOrigins
vuelveundefined
por míIntentalo:
Cuando cambia, se encuentra en un iframe, su host es "referente".
fuente
He tenido problemas con esto. Si usa un lenguaje como php cuando su página se carga por primera vez en el iframe grab
$_SERVER['HTTP_REFFERER']
y configúrelo en una variable de sesión.De esta manera, cuando la página se carga en el iframe, conoce la url principal completa y la cadena de consulta de la página que la cargó. Con la seguridad del navegador cruzado, es un poco dolor de cabeza contar con window.parent cualquier cosa si tiene diferentes dominios.
fuente
Descubrí que el ejemplo anterior sugería que funcionaba anteriormente cuando el script se estaba ejecutando en un iframe; sin embargo, no recuperó la URL cuando el script se ejecutó fuera de un iframe, se requirió un pequeño ajuste:
fuente
No pude obtener una solución anterior para trabajar, pero descubrí que si configuraba el iframe scr con, por ejemplo
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
, podría, en el extracto de iframe,thisdomain.com/thisfolder
usar el siguiente javascript:fuente
El problema con PHP $ _SERVER ['HTTP_REFFERER'] es que proporciona la URL de página totalmente calificada de la página que lo llevó a la página principal. Eso no es lo mismo que la página principal, en sí misma. Peor aún, a veces no hay http_referer, porque la persona escribió la url de la página principal. Entonces, si llego a su página principal desde yahoo.com, yahoo.com se convierte en http_referer, no en su página.
fuente
He encontrado en los casos en
$_SERVER['HTTP_REFERER']
que no funciona (te estoy mirando, Safari),$_SERVER['REDIRECT_SCRIPT_URI']
ha sido una copia de seguridad útil.fuente
En Chrome es posible usar location.ancestorOrigins. Devolverá todas las URL principales
fuente
Sé que la suya es muy antigua, pero me sorprende que nadie recomendara simplemente pasar las cookies de un dominio a otro. Como está utilizando subdominios, puede compartir cookies de un dominio base a todos los subdominios simplemente configurando cookies en la URL
.basedomain.com
Luego puede compartir cualquier información que necesite a través de las cookies.
fuente
Esto funcionó para mí para acceder a la URL del iframe src.
fuente
Obtener todas las funciones de iframe principal y HTML
fuente