Acessar URL pai de iframe

Ok, eu tenho uma página e nesta página eu tenho um iframe. O que preciso fazer é na página do iframe, descobrir qual é o URL da página principal.

Eu pesquisei e sei que isso não é possível se a minha página de iframe estiver em um domínio diferente, pois isso é um script entre sites. Mas em todos os lugares que li, diz que, se a página do iframe estiver no mesmo domínio que a página pai, isso deve 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 as mesmas informações.

De qualquer forma, então aqui está o problema. Meu iframe está no mesmo domínio da página principal, mas não no mesmo domínio. Então, por exemplo, eu tenho

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

e meu URL de iframe é

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

Quando tento pegar o URL de pageB.html (a página do iframe), continuo recebendo o mesmo erro de access negado. Portanto, parece que até mesmo os subdomínios são considerados scripts entre sites, está correto ou estou fazendo algo errado?

Você está certo. Subdomínios ainda são considerados domínios separados ao usar iframes. É possível passar 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.

Sim, o access ao URL da página pai não é permitido se o iframe e a página principal não estiverem no mesmo (sub) domínio. No entanto, se você precisar apenas da URL da página principal (ou seja, o URL do navegador), você pode tentar isto:

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

Nota:

window.parent.location é permitido; evita o erro de segurança no OP, que é causado pelo access à propriedade href : window.parent.location.href causa “Blocked a frame with origin …”

document.referrer refere-se a “o URI da página que está vinculada a esta página”. Isso pode não retornar o documento que contém se alguma outra origem for o que determinou o local do iframe , por exemplo:

  • Container iframe @ Domain 1
  • Envia o iframe filho para o domínio 2
  • Mas no iframe filho … o Domínio 2 redireciona para o Domínio 3 (ou seja, para autenticação, talvez SAML) e, em seguida, o Domínio 3 é direcionado de volta ao Domínio 2 (ou seja, por meio do envio de formulário (), uma técnica SAML padrão)
  • Para o iframe filho, o document.referrer será o Domínio 3 , e não o Domínio contendo 1.

document.location refere-se a “um object Location, que contém informações sobre o URL do documento”; presumivelmente o documento atual , isto é, o iframe atualmente aberto. Quando window.location === window.parent.location , então o href do iframe é o mesmo que o href do pai que o contém.

Acabei de descobrir uma solução alternativa para esse problema que é tão simples, e ainda não encontrei nenhuma discussão em lugar algum que a mencionasse. Isso requer o controle do quadro pai.

Em seu iFrame, digamos que você queira este 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 seu iframe, obtenha o URL pai por meio de javascript “em tempo de compilation” e envie-o como um parâmetro GET de URL na querystring de seu destino src assim:

  

Em seguida, encontre uma function de análise de url do javascript que analise a sequência de url para obter a variável de url que você procura, neste caso é “url”.

Eu encontrei um analisador de string de url grande aqui: http://www.netlobo.com/url_query_string_javascript.html

Se o seu iframe for de outro domínio (cross domain), você simplesmente precisará usar isto:

 var currentUrl = document.referrer; 

e – aqui você tem o URL principal!

Para páginas no mesmo domínio e subdomínio diferente, você pode definir a propriedade document.domain via javascript.

Tanto o frame pai quanto o iframe precisam definir seu document.domain como algo comum entre eles.

ou seja, www.foo.mydomain.com e api.foo.mydomain.com poderiam usar foo.mydomain.com ou apenas mydomain.com e ser compatíveis (não, você não pode configurá-los para com , por motivos de segurança). ..)

Observe também que document.domain é uma rua de mão única. Considere executar as três instruções a seguir em ordem:

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

Os navegadores modernos também podem usar o window.postMessage para conversar entre origens, mas não funcionará no IE6. https://developer.mozilla.org/en/DOM/window.postMessage

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

Descobri que o exemplo acima sugerido anteriormente funcionava quando o script estava sendo executado em um iframe. No entanto, ele não recuperou o URL quando o script foi executado fora de um iframe. Um pequeno ajuste foi necessário:

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

Eu tive problemas com isso. Se estiver usando uma linguagem como php quando sua página é carregada pela primeira vez no iframe, pegue $_SERVER['HTTP_REFFERER'] e configure-a para uma variável de session.

Dessa forma, quando a página é carregada no iframe, você conhece o URL pai completo e a string de consulta da página que a carregou. Com a segurança do navegador cruzado é um pouco de dor de cabeça contando com window.parent nada se você tem domínios diferentes.

Não consegui fazer a solução anterior funcionar, mas descobri que, se eu definir o iframe scr com, por exemplo, http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder , poderei, no iframe extract thisdomain.com/thisfolder usando o seguinte javascript:

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

O problema com o PHP $ _SERVER [‘HTTP_REFFERER’] é que ele fornece o URL completo da página que trouxe você para a página pai. Isso não é o mesmo que a própria página pai. Pior, às vezes não há http_referer, porque a pessoa digitou na url da página pai. Então, se eu chegar à sua página principal do yahoo.com, o yahoo.com se tornará o http_referer, não a sua página.

Eu encontrei nos casos em que $_SERVER['HTTP_REFERER'] não funciona (estou olhando para você, Safari), $_SERVER['REDIRECT_SCRIPT_URI'] tem sido um backup útil.

Isso funcionou para eu acessar o url srr do iframe.

 window.document.URL 

Obter todas as funções Iframe pai e 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;