如果我像这样创建一个iframe
:
var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({
我该如何修复错误:
拒绝在框架中显示
'https://www.google.com.ua/?gws_rd=ssl'
,因为它将'X-Frame-Options'设置为'SAMEORIGIN'。
用JavaScript?
你不能在X-Frame-Options
上设置iframe
。这是您请求资源的域设置的响应标头(在您的示例中为google.com.ua
)。在这种情况下,他们将标头设置为SAMEORIGIN
,这意味着他们不允许在域外的iframe
中加载资源。有关更多信息,请参阅MDN上的The X-Frame-Options response header。
快速检查标题(在Chrome开发人员工具中显示)会显示从主机返回的X-Frame-Options
值。
为此,您需要匹配apache中的位置或您正在使用的任何其他服务
如果您正在使用apache然后在httpd.conf文件中。
<LocationMatch "/your_relative_path">
ProxyPass absolute_path_of_your_application/your_relative_path
ProxyPassReverse absolute_path_of_your_application/your_relative_path
</LocationMatch>
你可以在你想要加载iframe的网站的web配置中设置x-frame-option
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="*" />
</customHeaders>
</httpProtocol>
您无法在HTML正文中添加x-iframe,因为它必须由网站所有者提供,并且它位于服务器规则中。
您可以做的是创建一个PHP文件,它加载目标URL的内容和iframe的php URL,这应该可以顺利进行。
你可以在tomcat实例级配置文件(web.xml)中执行它,需要在web.xml配置文件中添加'filter'和filter-mapping'。这将在所有页面中添加[X-frame-options = DENY],因为它是一个全局设置。
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>antiClickJackingEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>DENY</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
你似乎误解了这个问题。如果请求的域将允许自己在帧内显示,则X-Frame-Options
是对请求的响应中包含的头。它与javascript或HTML无关,也不能由请求的发起者更改。
本网站设置此标题以禁止它显示在iframe
中。你无能为力阻止这种行为。
如果您控制发送iframe内容的服务器,则可以在网络服务器中设置X-Frame-Options
的设置。
要为所有页面发送X-Frame-Options标头,请将其添加到您网站的配置中:
Header always append X-Frame-Options SAMEORIGIN
要配置nginx以发送X-Frame-Options标头,请将其添加到您的http,服务器或位置配置中:
add_header X-Frame-Options SAMEORIGIN;
此标头选项是可选的,因此如果未设置该选项,您将提供将其配置为下一个实例的选项(例如访问者浏览器或代理)
来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options
不是......我用过
<system.webServer>
<httpProtocol allowKeepAlive="true" >
<customHeaders>
<add name="X-Frame-Options" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
由于服务器端没有真正提到解决方案:
一个人必须设置这样的东西(例如来自apache),这不是最佳选择,因为它允许所有内容,但在您看到服务器正常工作后,您可以轻松更改设置。
Header set Access-Control-Allow-Origin "*"
Header set X-Frame-Options "allow-from *"
X-Frame-Options HTTP响应头可用于指示是否允许浏览器在<frame>
,<iframe>
或<object>
中呈现页面。站点可以通过确保其内容未嵌入到其他站点中来避免点击劫持攻击。
欲了解更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
我有一个替代解决方案来解决这个问题,我将通过使用PHP来演示:
iframe.php:
<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>
target_url.php:
<?php
echo file_get_contents("http://www.example.com");
?>
我的virtualmin服务器(apache)在子目录中的wordpress上遇到了同样的问题,上述答案都没有解决我案例中的问题,仍然在控制台上收到x-frame-options denied错误消息,直到我尝试添加下面的行到我的.htaccess
(wordpress root)目录下的public_html\subdirectory\
文件:
header always set x-frame-options "SAMEORIGIN"
这是我案件中唯一可行的解决方案。 (请注意,有一部分包含always set
而不是append
或always append
)
解决方案是安装浏览器插件。
发布值为X-Frame-Options
(或具有不同服务器来源的DENY
)的HTTP标头SAMEORIGIN
的网站无法集成到IFRAME中...除非您通过安装忽略X-Frame-Options
标头的浏览器插件(例如Chrome's Ignore X-Frame Headers)来更改此行为。
请注意,出于安全原因,根本不建议这样做。
如果没有任何帮助,你仍然想在iframe中展示该网站,请考虑使用将使用代理的X Frame Bypass Component。