我正在写一个小网页,它的目的是框架其他一些页面,只是为了将它们合并到一个浏览器窗口中,以便于查看。一些页面,我试图框架禁止被框架,并抛出“拒绝显示文档,因为显示禁止X-Frame-Options.”错误在Chrome。我知道这是一个安全限制(有充分的理由),并且无法更改它。
是否有任何替代的框架或非框架方法来在单个窗口中显示页面,而不会被X-Frame-Options报头绊倒?
我正在写一个小网页,它的目的是框架其他一些页面,只是为了将它们合并到一个浏览器窗口中,以便于查看。一些页面,我试图框架禁止被框架,并抛出“拒绝显示文档,因为显示禁止X-Frame-Options.”错误在Chrome。我知道这是一个安全限制(有充分的理由),并且无法更改它。
是否有任何替代的框架或非框架方法来在单个窗口中显示页面,而不会被X-Frame-Options报头绊倒?
当前回答
FWIW:
当这个“破坏者”代码出现时,我们遇到了需要杀死iFrame的情况。因此,我使用PHP函数get_headers($url);在iFrame中显示远程URL之前检查它。为了获得更好的性能,我将结果缓存到一个文件中,这样就不会每次都建立HTTP连接。
其他回答
<form target="_parent" ... />
根据Kevin Vella的想法,我尝试在PayPal的按钮生成器生成的表单元素上使用上述方法。为我工作,这样贝宝不会在一个新的浏览器窗口/标签打开。
更新
这里有一个例子:
在今天(01-19-2021)生成按钮时,PayPal自动在表单元素上包含target="_top",但如果这对您的上下文不起作用,请尝试不同的目标值。我建议_parent——至少当我使用这个PayPal按钮时,它是有效的。
有关更多信息,请参阅表单目标值。
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_parent">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="name@email.com">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="0">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHostedGuest">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
将外部网站加载到iFrame的解决方案,即使外部网站的x帧选项设置为拒绝。
如果你想将其他网站加载到iFrame中,而你得到了X-Frame-Options禁止显示的错误,那么你实际上可以通过创建一个服务器端代理脚本来克服这个问题。
iFrame的src属性可以有这样一个url:/ proxy.php?url=https://www.example.com/page&key=somekey
那么proxy.php看起来就像这样:
if (isValidRequest()) {
echo file_get_contents($_GET['url']);
}
function isValidRequest() {
return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) &&
$_GET['key'] === 'somekey';
}
这通过传递块,因为它只是一个GET请求,可能是一个普通的浏览器页面访问。
注意:您可能需要改进此脚本中的安全性。因为黑客可以通过你的代理脚本开始加载网页。
虽然没有提及,但在某些情况下可以有所帮助:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
if (xhr.status === 200) {
var doc = iframe.contentWindow.document;
doc.open();
doc.write(xhr.responseText);
doc.close();
}
}
xhr.open('GET', url, true);
xhr.send(null);
试试这个东西,我认为没有人在主题中建议过这个,这将解决你70%的问题,对于其他一些页面,你必须废弃,我有完整的解决方案,但不是公开的。
添加到下面的iframe中
沙箱="允许-同源允许-脚本允许-弹出窗口允许-表单"
这就是解决办法!!
FB.Event.subscribe('edge.create', function(response) {
window.top.location.href = 'url';
});
这是唯一适用于facebook应用的方法!