谷歌浏览器阻止了iframe中window.top.location的重定向



我想将我的网站从iframe重定向到主url,这是我的代码:

window.setTimeout(function() {
window.top.location = jQuery("link[rel=canonical]").attr("href") + "#ref=shahrekhabar";
return false;
}, 100);

它适用于Firefox,但谷歌Chrome阻止了这种类型的重定向。我尝试了window.top.location.hrefwindow.top.location.replacewindow.top.location.assign,但没有成功。

原因:

一些垃圾邮件网站在iframe中显示我的网站,我想逃离它们,我认为重定向是一个很好的解决方案。

编辑以回答TRUE问题:

堆栈溢出的一个常见问题是,用户经常会问如何做他们认为可以解决他们遇到的问题的事情,而不仅仅是问我们如何解决问题。我们总是很感激听到你如何努力解决你的问题,但最好我们知道根本问题是什么。因此,在你的情况下,鉴于你对我的回答的评论,问题应该是:

目前我的网站在iframe中显示在我无法控制的网站上?我想阻止他们这样做,我怎么能这样做?我目前正在尝试将我的网站从iframe重定向到主url,但它在Chrome上不起作用。。。剩下的问题。。。

对于这个问题,我最初的答案是无用的:

  • 您仍然不能也不应该更改父窗口的URL
  • 您没有在iframe中显示页面的站点,这意味着您无法注册侦听器来处理postMessage或CustomEvent

有趣的是,你想做的正是chrome不让你做的原因哈哈哈。但别担心,仍然有解决方案。

CORS简介

CORS或跨来源资源共享是一个域上的站点访问不在同一域上的资源时的名称。谁拥有这两个网站并不重要,如果这两个域名不同,那就是CORS。现在,这对你来说很好,因为有一些CORS策略,如果任何人提出CORS请求,你可以阻止他们访问你域上的资源。请记住,这意味着你不能在另一个网站的iframe中显示你的网站,除非它们在同一个域上,但这听起来可能对你来说是值得的。

如果你很好奇,与你试图做的不同,对于那些不希望自己的网站出现在iframe中的开发人员来说,使用CORS策略是一个非常标准的程序,事实上,facebook、谷歌甚至好的ole stackoverflow等著名网站都在使用CORS政策(我知道,我曾试图通过iframe同时查看多个问题)。我在下面附上了一个例子,说明这一切都是真的,还有一个不在乎的网站的例子(editpad.org)。为了在你的网站上实现这一点,请查看这个链接。

<iframe src="https://www.editpad.org/"> </iframe>
<iframe src="https://www.google.com/"> </iframe>
<iframe src="https://www.facebook.com/"> </iframe>
<iframe src="https://stackoverflow.com/posts/53917955"> </iframe>

老答案:

所以您正试图从iframe更改父窗口的位置?这听起来非常危险,事实上Firefox并没有阻止它,这让我很担心。Chrome做得好!

你为什么不想要这个

我能想出几个你不想要的原因,但最大的原因是它只是糟糕的编程。页面的工作应该完全独立于它是否在iframe中,即使页面应该只在iframe中查看,它仍然不应该以如此直接的方式与父窗口交互。

如果在所有平台上都允许,可能会出现的问题:

  • 在你的广告中包含一个iframe,一旦你的广告显示出来,就将用户重定向到你的网站,或者更糟的是,将他们重定向到你托管的当前网站的镜像,以收集密码/个人信息
  • 如果你可以扰乱窗口的位置(可以说是查看网页中最重要和最静态的事情),为什么你不能扰乱任何东西?您是否可以进入父窗口并调整DOM或对类型为password的输入进行查询选择,以便复制值?或者,将事件侦听器静默地附加到父窗口,以便您可以记录任何和所有按键

如何解决它

不要太担心我上面提到的问题,因为遵循适当的标准可以避免这些问题。事实上,JavaScript开发人员设想了这个确切的问题,这就是为什么你可以在窗口之间发布消息。查看此链接,然后从那里开始,如果您有任何问题,请随时发表评论,但它应该很简单,只需发布一条消息,在父窗口上检测到它,然后根据您的意愿更改位置。

如果你需要将数据从iframe发送到父窗口,或者你的iframe不在同一个域上,你可以使用CustomEvents(即使我的ifame在同一域上,我也更喜欢它),它允许你附加数据对象。

至于为什么这两种解决方案中的任何一种都比直接操作父窗口更好,这都是因为父窗口需要为消息/自定义事件注册一个侦听器。如果你的页面不在iframe内,它只会向自己发布一条消息,而它不会监听。如果你的页面在它应该所在的页面上的iframe中,那么你的父页面应该已经注册了合适的侦听器。而且不可能恶意使用这些功能,因为同样,我必须注册一个侦听器,并选择一旦捕捉到事件时如何处理。

最新更新