Ok, eu tenho uma página e nesta página eu tenho um iframe. O que preciso fazer é na página iframe, descobrir qual é o URL da página principal.
Eu pesquisei e sei que isso não é possível se minha página iframe estiver em um domínio diferente, pois isso é script entre sites. Mas em todo lugar que eu li diz que, se a página iframe estiver no mesmo domínio da página pai, ela funcionará se eu fizer, por exemplo:
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href
... ou outros combos semelhantes, pois parece haver várias maneiras de obter a mesma informação.
Enfim, então aqui está o problema. Meu iframe está no mesmo domínio da página principal, mas não está no mesmo domínio SUB. Então, por exemplo, eu tenho
http: // www.mysite.com/pageA.html
e meu URL iframe é
http: // qa-www.mysite.com/pageB.html
Quando tento pegar o URL pageB.html
(na página iframe), continuo recebendo o mesmo erro de acesso negado. Portanto, parece que até mesmo subdomínios contam como scripts entre sites, isso está correto ou estou fazendo algo errado?
fonte
<iframe src="url?parent=parent-url"></iframe>
Respostas:
Você está certo. Os subdomínios ainda são considerados domínios separados ao usar iframes. É possível transmitir mensagens usando
postMessage(...)
, mas outras APIs JS são intencionalmente inacessíveis.Também é possível obter o URL, dependendo do contexto. Veja outras respostas para mais detalhes.
fonte
Sim, o acesso ao URL da página pai não será permitido se o iframe e a página principal não estiverem no mesmo (sub) domínio. No entanto, se você só precisa do URL da página principal (ou seja, o URL do navegador), pode tentar o seguinte:
Nota:
window.parent.location
é permitido; evita o erro de segurança no OP, causado pelo acesso àhref
propriedade:window.parent.location.href
causas "Bloqueou um quadro com origem ..."document.referrer
refere-se a "o URI da página vinculada a esta página". Isso pode não retornar o documento que contém se alguma outra fonte for o que determinou oiframe
local, por exemplo:document.referrer
, será o Domínio 3 , não o Domínio 1 que o contém .document.location
refere-se a "um objeto Local, que contém informações sobre a URL do documento"; presumivelmente o documento atual , ou seja, o iframe aberto no momento. Quandowindow.location === window.parent.location
, o iframehref
é o mesmo que o pai principalhref
.fonte
document.domain
na moldura superior e na mais interna. talvez.var url = (parent !== window) ? document.referrer : document.location;
Referer-Policy
cabeçalho.Acabei de descobrir uma solução alternativa para esse problema que é tão simples e, no entanto, não encontrei nenhuma discussão em nenhum lugar que o mencionasse. Requer controle do quadro pai.
No seu iFrame, diga que deseja esse iframe: src = "http://www.example.com/mypage.php"
Bem, em vez de HTML para especificar o iframe, use um javascript para criar o HTML para o seu iframe, obtenha o URL pai através do javascript "no momento da criação" e envie-o como um parâmetro GET do URL na string de consulta do seu destino src, como tão:
Em seguida, encontre uma função de análise de url de javascript que analisa a string de url para obter a variável de url que você procura, nesse caso, é "url".
Encontrei um ótimo analisador de cadeia de URL aqui: http://www.netlobo.com/url_query_string_javascript.html
fonte
Se o seu iframe for de outro domínio (domínio cruzado), você simplesmente precisará usar isso:
e - aqui você tem o URL principal!
fonte
window.location.reload(true)
), isso não funcionará mais. O referenciador é o URL do próprio iframe.Para páginas no mesmo domínio e subdomínio diferente, você pode definir a
document.domain
propriedade via javascript.Tanto o quadro pai quanto o iframe precisam definir seu documento. Domínio como algo comum entre eles.
ou seja,
www.foo.mydomain.com
eapi.foo.mydomain.com
cada um pode usar umfoo.mydomain.com
ou apenasmydomain.com
e ser compatível (não, você não pode configurá-los paracom
, por razões de segurança ...)Além disso, observe que document.domain é uma via de mão única. Considere executar as três instruções a seguir em ordem:
Navegadores modernos também podem usar o window.postMessage para falar sobre as origens, mas não funcionará no IE6. https://developer.mozilla.org/en/DOM/window.postMessage
fonte
A seguinte linha funcionará:
document.location.ancestorOrigins[0]
esta retorna o nome de domínio ancestral.fonte
document.location.ancestorOrigins
voltaundefined
para mimTente:
Quando você muda, você está em um iframe, seu host é "referenciador".
fonte
Eu tive problemas com isso. Se você estiver usando um idioma como php quando sua página for carregada pela primeira vez no iframe,
$_SERVER['HTTP_REFFERER']
defina-o como uma variável de sessão.Dessa forma, quando a página é carregada no iframe, você conhece o URL pai completo e a string de consulta da página que o carregou. Com a segurança do navegador cruzado, é um pouco difícil contar com window.parent qualquer coisa, se você tiver domínios diferentes.
fonte
Descobri que o exemplo acima sugerido funcionava anteriormente quando o script estava sendo executado em um iframe, no entanto, ele não recuperou a URL quando o script foi executado fora de um iframe, um pequeno ajuste foi necessário:
fonte
Não consegui fazer a solução anterior funcionar, mas descobri que, se eu definir o iframe scr por exemplo
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
, poderia, na extração do iframethisdomain.com/thisfolder
, usando o seguinte javascript:fonte
O problema com o PHP $ _SERVER ['HTTP_REFFERER'] é que ele fornece o URL da página totalmente qualificado da página que o levou à página pai. Isso não é o mesmo que a página pai, por si só. Pior, às vezes não há http_referer, porque a pessoa digitou no URL da página pai. Portanto, se eu acessar a página pai do yahoo.com, o yahoo.com se tornará o http_referer, não a sua página.
fonte
Eu encontrei nos casos em
$_SERVER['HTTP_REFERER']
que não funciona (estou olhando para você, Safari),$_SERVER['REDIRECT_SCRIPT_URI']
foi um backup útil.fonte
No chrome, é possível usar location.ancestorOrigins Ele retornará todos os URLs pai
fonte
Eu sei que o dele é super antigo, mas me surpreende que ninguém recomendasse apenas passar cookies de um domínio para outro. Como você está usando subdomínios, você pode compartilhar cookies de um domínio base para todos os subdomínios, definindo cookies para o URL
.basedomain.com
Depois, você pode compartilhar os dados de que precisa através dos cookies.
fonte
Isso funcionou para eu acessar o iframe src url.
fonte
Obter todas as funções pai Iframe e HTML
fonte