javascript - Google Chrome浏览器使用iframe中的window.top.location阻止了重定向

标签 javascript redirect

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

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


它可以在Firefox上运行,但Google Chrome阻止了这种重定向。
我尝试使用window.top.location.hrefwindow.top.location.replacewindow.top.location.assign但没有运气。

原因:

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

最佳答案

编辑以回答TRUE问题:

堆栈溢出的一个常见问题是,用户经常会问自己如何解决他们认为遇到的问题,而不仅仅是问我们如何解决问题。我们总是很高兴听到您如何努力解决问题,但是如果我们知道这是什么以及根本问题是什么,那总是最好的。因此,就您的情况而言,考虑到您对我的回答的评论,问题应该是:


  目前,我无法控制的网站在iframe中显示了我的网站?我想阻止他们这样做,我该怎么做?我目前正在尝试将我的网站从iframe重定向到主网址,但是在Chrome上无法正常工作。 ...其余的问题...


鉴于这个问题,我的原始答案无济于事:


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


有趣的是,您尝试做的是chrome不允许您这样做的确切原因。但是不用担心,仍然有解决方案。

介绍CORS!

当一个域中的站点访问不在同一域中的资源时,CORS或跨源资源共享是该名称。谁拥有两个站点都没有关系,如果两个域不同,那就是CORS。现在这对您有好处,因为存在诸如CORS策略之类的东西,如果有人提出CORS请求,您甚至可以阻止任何人访问您域中的资源。请记住,这意味着您无法在另一个网站的iframe中显示您的网站,除非它们位于同一域中,但这听起来很值得。

万一您好奇,不像您想做的那样,对于不希望其网站出现在iframe中的开发人员来说,使用CORS政策是非常标准的过程,而事实上,诸如Facebook之类的著名网站都在使用它,谷歌,甚至是很好的ole stackoverflow(我想,我试图通过一种iframe设法同时查看多个问题)。我在下面提供了一个示例,该示例显示了全部内容,以及一个无关站点的示例(editpad.org)。为了在您的网站check out this link上实施此操作。



<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,并在广告展示后立即将用户重定向到您的网站,或更糟糕的是,将他们重定向到您托管的当前网站的镜像以收集密码/个人信息。
如果您可以搞乱Windows的位置(可以说是正在查看网页的最重要和最静态的事情),为什么不搞乱任何东西?您是否可以进入父窗口并调整DOM或对password类型的输入进行查询选择以复制值?或者,如何将事件侦听器无声地附加到父窗口,以便您可以记录任何和所有按键。


您如何解决呢?

不必太担心我上面提到的问题,因为遵循适当的标准可以避免这些问题。实际上,JavaScript开发人员预见到了这个确切的问题,这就是为什么您可以post messages across windows的原因。查看此链接,然后从那里开始,如果您有任何疑问,请随时发表评论,但它应该像发布消息,在父窗口中检测到消息,然后根据需要更改位置一样简单。

如果您需要将数据从iframe发送到父窗口,或者iframe不在同一域中托管,则可以改用CustomEvents(即使我的iframe在同一域中,我也希望使用它)数据对象。

至于为什么这两种解决方案都比直接操作父窗口更好,这都是由于父窗口需要为消息/自定义事件注册一个侦听器。如果您的页面不在iframe内,它只会向自己发布一条消息,而该消息不会被监听。如果您的网页位于该网页的iframe内,则您的父网页应该已经注册了正确的侦听器。再也没有机会恶意使用这些功能,因为再次,我必须注册一个侦听器,并选择在事件被捕获后如何处理。

关于javascript - Google Chrome浏览器使用iframe中的window.top.location阻止了重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53917770/

相关文章:

javascript - 如何使用 Node JS 重定向?

redirect - 保留 Google +1、Facebook Like 和 Twitter Tweet 此按钮在 URI 更改后计数

http - HTTP/1.1 302 到底是什么意思?

php - 如何通过php和mysql中的用户类型重定向到不同的页面

php - 使用操作参数重定向 URL

javascript - 当伪 javascript 类已经初始化时,我在尝试修改 "this"对象时遇到了很多麻烦

javascript - 单击动态添加的元素

javascript - 如何将 block 按到主窗口底部?

javascript - 如何防止文本字段将 id "myid"更改为 "myid-tokenfield",Bootstrap 的 Tokenfield

javascript - 使用 StackBlur 平滑 Javascript 动画