好的,我在这个页面上有一个页面我有一个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页面)抓取网址时,我一直收到相同的访问被拒绝错误。所以看起来甚至子域都算作跨站点脚本,这是正确的,还是我做错了什么?
答案 0 :(得分:314)
是的,如果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
位置,那么不可能会返回包含文档,例如:
document.referrer
将是域 3 ,而不是包含域 1 document.location
指的是“一个位置对象,其中包含有关文档URL的信息”;可能是当前文档,即iframe当前打开。在window.location === window.parent.location
时,iframe的href
与相同与包含父级的href
。
答案 1 :(得分:45)
我刚刚发现这个问题的解决方法非常简单,但我还没有找到任何提及它的讨论。它确实需要控制父框架。
在你的iFrame中,假设你想要这个iframe:src =“http://www.example.com/mypage.php”
好吧,用HTML来指定iframe,使用javascript为iframe构建HTML,通过javascript“在构建时”获取父url,并将其作为url GET参数发送到src的querystring中目标,如:
<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”。
我在这里找到了一个很棒的url字符串解析器: http://www.netlobo.com/url_query_string_javascript.html
答案 2 :(得分:28)
如果您的iframe来自其他域(跨域),则只需使用此命令:
var currentUrl = document.referrer;
和 - 这里你有主要的网址!
答案 3 :(得分:19)
你是对的。使用iframe时,子域仍被视为单独的域。可以使用postMessage(...)
传递消息,但有意使其他JS API无法访问。
根据上下文,仍然可以获取URL。有关详细信息,请参阅其他答案。
答案 4 :(得分:16)
对于同一域和不同子域的网页,您可以通过javascript设置document.domain
属性。
父框架和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
答案 5 :(得分:6)
以下行将起作用:document.location.ancestorOrigins[0]
,这将返回祖先域名。
答案 6 :(得分:2)
var url = (window.location != window.parent.location) ? document.referrer: document.location;
我发现上面的示例建议以前在iframe中执行脚本时有效,但事实并非如此 在iframe外部执行脚本时检索url, 需要稍作调整:
var url = (window.location != window.parent.location) ? document.referrer: document.location.href;
答案 7 :(得分:2)
我遇到了这个问题。如果您的网页首次加载到iframe抓取$_SERVER['HTTP_REFFERER']
并将其设置为会话变量时使用像php这样的语言。
这样,当页面在iframe中加载时,您就知道加载它的页面的完整父URL和查询字符串。使用跨浏览器安全性,如果您使用不同的域,那么依靠window.parent会有点令人头痛。
答案 8 :(得分:1)
我发现在$_SERVER['HTTP_REFERER']
不起作用的情况下(我在看你,Safari),$_SERVER['REDIRECT_SCRIPT_URI']
是一个有用的备份。
答案 9 :(得分:1)
PHP $ _SERVER ['HTTP_REFFERER']的问题在于它提供了将您带到父页面的页面的完全限定页面URL。这与父页面本身不同。更糟糕的是,有时候没有http_referer,因为这个人输入了父页面的url。所以,如果我从yahoo.com到你的父页面,那么yahoo.com就会成为http_referer,而不是你的页面。
答案 10 :(得分:1)
我无法获得以前的解决方案,但我发现如果我使用例如http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
设置iframe src,那么我可以通过使用以下javascript在iframe提取thisdomain.com/thisfolder
中添加: / p>
var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];
答案 11 :(得分:1)
尝试一下:
document.referrer
更改后,您在iframe中的主机就是“引荐来源网址”。
答案 12 :(得分:0)
在Chrome中可以使用location.ancestorOrigins 它将返回所有父网址
答案 13 :(得分:0)
我知道他已经超龄了,但是我很惊讶,没有人建议仅将Cookie从一个域传递到另一个域。在使用子域时,只需将cookie设置为url .basedomain.com
然后,您可以通过cookie共享所需的任何数据。
答案 14 :(得分:0)
有一个用于获取父源的跨浏览器脚本:
private getParentOrigin() {
const locationAreDisctint = (window.location !== window.parent.location);
const parentOrigin = ((locationAreDisctint ? document.referrer : document.location) || "").toString();
if (parentOrigin) {
return new URL(parentOrigin).origin;
}
const currentLocation = document.location;
if (currentLocation.ancestorOrigins && currentLocation.ancestorOrigins.length) {
return currentLocation.ancestorOrigins[0];
}
return "";
}
此代码应该适用于 Chrome 和 Firefox。
答案 15 :(得分:-1)
我可以访问iframe src网址。
window.document.URL
答案 16 :(得分:-1)
就我而言,document.location.href
已经足够了。
答案 17 :(得分:-4)
获取所有父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;