为啥 Iframe 不适用于 yahoo.com
Posted
技术标签:
【中文标题】为啥 Iframe 不适用于 yahoo.com【英文标题】:Why Iframe dosen't work for yahoo.com为什么 Iframe 不适用于 yahoo.com 【发布时间】:2013-05-13 13:24:55 【问题描述】:我发现这不起作用:
<iframe src="http://www.yahoo.com"> </iframe>
我已经阅读了这个question,但我不明白他们所说的添加是什么意思:
<?php
header('X-Frame-Options: GOFORIT');
?>
我尝试将它添加到我的 html 文件的顶部(当然,将其更改为 php 文件),我的 php 文件变为:
<?php
header('X-Frame-Options: GOFORIT');
?>
<iframe src="http://www.yahoo.com"> </iframe>
我在我的 appserv(使用 php 5.2.6)中运行它,但它不起作用。谁能解释我应该怎么做才能克服这个问题?
【问题讨论】:
【参考方案1】:在 google chorme 中添加 'Ignore X-Frame headers' 插件,然后它就可以正常工作了。
【讨论】:
要求您网站的每个访问者都这样做是不合理的。【参考方案2】:你运气不好:yahoo.com 不允许你将他们的网站嵌入到 iframe 中。 facebook 或其他流行网站也没有。
这个限制的原因是clickjacking。
您可以通过检查他们网站的响应标头来验证这一点;他们指定X-Frame-Options:SAMEORIGIN
,这意味着只有 yahoo.com 可以嵌入 yahoo.com 页面。
一些较旧的浏览器不会强制标头,但所有新浏览器都会。 Afaik,没有简单的解决方法。
我能想到的唯一解决方案是实现代理脚本,即您在服务器上嵌入一个脚本,为您获取远程内容。
例如。您的 iframe 调用“/my-proxy.php?url=http://www.yahoo.com/”,该脚本如下所示:
<?php
header('X-Frame-Options: SAMEORIGIN'); // don't allow other sites to use my proxy
echo file_get_contents($_GET['url']);
您的里程可能会有所不同...
【讨论】:
似乎有效!我会再测试一下……如果后续测试没有问题,你会得到200声望,正如我承诺的那样 coursera.org 通过 HTTPS 提供服务。您可能只需要启用/安装php_openssl
扩展程序即可使其工作。
*** 使用 javascript 来防止 iframe 嵌入。仅供参考,这不是一个好的解决方案。好的解决方案是完全避免 iframe:ux.stackexchange.com/questions/4934/…
网站有不同的方法来防止 iframe。有些使用标头(如 yahoo),有些使用 javascript(如 ***)。尽管它们是通过使用代理和使用正则表达式重写代码来解决这些问题的方法,但这是非常糟糕的做法。举个简单的例子,我的代理解决方案已经足够好了,但仅此而已。抱歉,没有更好的解决方案适合您。随意提出一个新的/更具体的问题。【参考方案3】:
某些网站(如 google、yahoo)已禁用其网站的 iframe 嵌入。如果你想这样做,那么在服务器端使用 curl 或 file_get_conents 获取他们的 html 并显示它。
检查 HTTP 响应标头 X-Frame-Option。我认为对于雅虎来说应该是拒绝或同源,这意味着只有雅虎的页面可以在 iframe 中嵌入它的其他页面
【讨论】:
【参考方案4】:您在跨域资源共享方面遇到问题。阅读这些Wikipedia CORS 和MDN CORS 文章。
至于你的sn-p,
<?php
header('X-Frame-Options: GOFORIT');
?>
需要添加到正在服务的页面,而不是添加到请求它的页面/代码,在本例中为yahoo.com
。但是由于您自己不提供yahoo.com
,所以无法添加它。
但是如果问题是关于您自己的网页并且yahoo.com
只是一个示例,您只需按照文章中的说明设置正确的 HTTP 标头,就可以了。 p>
【讨论】:
以上是关于为啥 Iframe 不适用于 yahoo.com的主要内容,如果未能解决你的问题,请参考以下文章