从iframe访问父网址

2020/10/19 02:01 · javascript ·  · 0评论

好的,我有一个页面,并且在此页面上有一个iframe。我需要做的是在iframe页面上,找出主页的URL。

我进行了搜索,我知道如果我的iframe页面位于其他域上是不可能的,因为这是跨站点脚本。但是我读过的所有内容都说,如果iframe页面与父页面位于同一域中,那么例如,它应该可以工作:

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

...或其他类似的组合,因为似乎有多种获取相同信息的方法。

无论如何,这就是问题所在。我的iframe与主页位于同一域中,但不在同一SUB域中。例如,我有

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

然后我的iframe网址是

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

当我尝试从pageB.html(iframe页面)获取URL时,我不断收到相同的拒绝访问错误。这样看来,即使子域也算作跨站点脚本,这是正确的,还是我做错了什么?

没错 使用iframe时,子域仍被视为单独的域。可以使用传递消息postMessage(...),但是故意使其他JS API无法访问。

仍然可以根据上下文获取URL。有关更多详细信息,请参见其他答案。

是的,如果iframe和主页不在同一(子)域中,则不允许访问父页面的URL。但是,如果您只需要主页的URL(即浏览器URL),则可以尝试以下操作:

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

注意:

window.parent.location被允许; 它避免了OP中的安全错误,该错误是由访问href属性引起的window.parent.location.href导致“使用原点阻止帧...”

document.referrer指“链接到此页面的页面的URI”。如果确定位置的其他来源,则可能不会返回包含文档iframe,例如:

  • 容器iframe @域1
  • 将子iframe发送到域2
  • 但是在子iframe中...域2重定向到域3(即用于身份验证,可能是SAML),然后域3重定向域2(即,通过标准SAML技术FormSubmit())
  • 对于子iframe,document.referrer它将是域3,而不是包含域1

document.location指“位置对象,其中包含有关文档URL的信息”;大概是当前文档,即当前打开的iframe。window.location === window.parent.location,那么iframe的href为含母公司href

我刚刚发现了解决此问题的方法,它非常简单,但在任何提及它的地方都没有找到任何讨论。它确实需要控制父框架。

在您的iFrame中,说您想要此iframe:src =“ http://www.example.com/mypage.php”

嗯,不是使用HTML来指定iframe,而是使用JavaScript来为iframe构建HTML,“在构建时”通过javascript获取父网址,并将其作为url GET参数发送到src目标的查询字符串中,例如所以:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

然后,为自己找到一个javascript url解析函数,该函数解析url字符串以获取所需的url变量,在本例中为“ url”。

我在这里找到了一个很棒的网址字符串解析器:http :
//www.netlobo.com/url_query_string_javascript.html

如果您的iframe来自另一个域(跨域),则只需使用以下命令:

var currentUrl = document.referrer;

-在这里,您有了主网址!

以下行将起作用:document.location.ancestorOrigins[0]返回祖先域名。

对于相同域和不同子域上的页面,可以document.domain通过javascript设置属性。

父框架和iframe都需要将其document.domain设置为它们之间的通用名称。


www.foo.mydomain.com并且api.foo.mydomain.com能在每次使用任一foo.mydomain.com或只是mydomain.com和兼容(不,你不能将它们都设置为com,出于安全原因...)

另外,请注意document.domain是一条单向路。考虑按顺序运行以下三个语句:

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

现代的浏览器也可以使用window.postMessage跨源对话,但是在IE6中将无法使用。
https://developer.mozilla.org/en/DOM/window.postMessage

试试吧:

document.referrer

更改后,您位于iframe中,您的主机就是“引荐来源网址”。

我对此有疑问。如果您的网页在第一次加载iframe时使用了php之类的语言$_SERVER['HTTP_REFFERER'],并将其设置为会话变量。

这样,当网页在iframe中加载时,您就知道加载该网页的完整父URL和查询字符串。有了跨浏览器的安全性,对于window.parent来说,如果您使用不同的域,那就太麻烦了。

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

我发现上面的示例先前建议的是在iframe中执行脚本时起作用的,但是在iframe外部执行脚本时它没有检索网址,因此需要进行一些调整:

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

我无法获得以前的解决方案,但是我发现,如果我将iframe scr设置为例如,http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder那么我可以thisdomain.com/thisfolder使用以下javascript在iframe提取中

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

PHP $ _SERVER ['HTTP_REFFERER']的问题在于,它提供了将您带到父页面的页面的标准页面URL。这与父页面本身不同。更糟糕的是,有时没有http_referer,因为此人在父页面的url中键入内容。因此,如果我从yahoo.com转到您的父页面,则yahoo.com将成为http_referer,而不是您的页面。

我发现在$_SERVER['HTTP_REFERER']无法正常工作的情况下(我正在浏览Safari)$_SERVER['REDIRECT_SCRIPT_URI']是一种有用的备份。

在chrome中,可以使用location.ancestorOrigins它将返回所有父URL

我知道他已经超龄了,但是我不敢建议只将Cookie从一个域传递到另一个域。在使用子域时,只需将cookie设置为url,就可以将基本域的cookie共享给所有子域。.basedomain.com

然后,您可以通过cookie共享所需的任何数据。

这对我来说可以访问iframe src网址。

window.document.URL

获取所有父级Iframe函数和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;
本文地址:http://javascript.askforanswer.com/congiframefangwenfuwangzhi.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!