克服“X-Frame-Options禁止显示”
我正在编写一个小型网页,其目的是构build其他几个页面,只需将它们合并到一个浏览器窗口中便于查看。 我试图禁止框架中的几个页面,并抛出“拒绝显示文档,因为X-Frame-Options禁止显示”。 Chrome中出现错误。 我明白,这是一个安全限制(有充分的理由),并没有改变它的权限。
有没有其他的框架或非框架的方法来显示单个窗口内的页面不会被X-Frame-Options标题绊倒?
我有一个类似的问题,我试图从我们自己的网站在iframe中显示内容(作为带有Colorbox的Lightbox样式对话框),以及我们在服务器范围内的“X-Frame-Options SAMEORIGIN”源服务器阻止它加载到我们的testing服务器上。
这似乎没有被logging在任何地方,但如果你可以编辑你想要iframe的页面(例如,他们是你自己的页面),只需发送另一个X-Frame-Options标题,任何string都禁用SAMEORIGIN或DENY命令。
例如。 为PHP,放
<?php header('X-Frame-Options: GOFORIT'); ?>
在页面的顶部将使浏览器将两者结合起来,从而得到一个标题
X-Frame-Options SAMEORIGIN, GOFORIT
…并允许您在iframe中加载页面。 这似乎工作时,最初的SAMEORIGIN命令设置在服务器级别,你想覆盖它的逐页情况。
祝一切顺利!
如果您的YouTubevideo出现此错误,而不是使用完整url,请使用共享选项中的embeddedurl。 它看起来像http://www.youtube.com/embed/eCfDxZxTBW4
您也可以更换watch?v=
embed/
所以http://www.youtube.com/watch?v=eCfDxZxTBW4
变为http://www.youtube.com/embed/eCfDxZxTBW4
如果在尝试将iframe
&output=embed
到iframe
出现此错误,则需要将&output=embed
添加到源链接。
您可以使用客户端JavaScript和YQL绕过<iframe>
中的X-Frame-Options
。 这是一个概念certificate: 黑客新闻在<iframe>
。 (在Chrome浏览器和Firefox浏览器中进行testing;如果不起作用,请尝试刷新页面。)
过程如下:
- 从YQL(函数
loadURL
)请求一个iframe URL, - 从YQL获取HTML数据(函数
getData
), - 使用YQL在iframe中添加
<base link>
和<script>
加载链接, - 将这个HTML注入一个空的
<iframe>
(函数loadHTML
)。
示例JS代码:
var iframe = document.getElementsByTagName('iframe')[0]; var url = iframe.src; var getData = function (data) { if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content); else if (data && data.error && data.error.description) loadHTML(data.error.description); else loadHTML('Error: Cannot load ' + url); }; var loadURL = function (src) { url = src; var script = document.createElement('script'); script.src = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData'; document.body.appendChild(script); }; var loadHTML = function (html) { iframe.src = 'about:blank'; iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>')); iframe.contentWindow.document.close(); } loadURL(iframe.src);
添加一个
target='_top'
到我的链接在Facebook选项卡中修复了我的问题…
如果您在尝试embeddedVimeo内容时遇到此错误,请更改iframe的src,
来自: https : //vimeo.com/63534746
到: http : //player.vimeo.com/video/63534746
Chrome有一个插件,用于删除该标题条目(仅供个人使用):
当我尝试在iframe中embeddedmoodle 2时,我遇到了同样的问题,解决scheme是Site administration ► Security ► HTTP security
并检查Allow frame embedding
这是解决scheme的家伙!
FB.Event.subscribe('edge.create', function(response) { window.top.location.href = 'url'; });
唯一的工作为Facebook应用程序!
我与mediawiki有同样的问题,这是因为服务器出于安全原因拒绝将页面embedded到iframe中。
我解决了它的写作
$wgEditPageFrameOptions = "SAMEORIGIN";
进入mediawiki phpconfiguration文件。
希望它有帮助。
唯一的问题有一堆答案。 我希望我能够在最后期限当天晚上10点半的时候为此付出努力… FB用帆布应用程序做了一些奇怪的事情,当然,你也被警告过了。 如果你仍然在这里,你有一个将出现在Facebookcanvas背后的Rails应用程序,那么你将需要:
的Gemfile:
gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'
configuration/ facebook.yml
facebook: key: "123123123123" secret: "123123123123123123secret12312"
configuration/ application.rb中
config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false
configuration/初始化/ omniauth.rb
OmniAuth.config.logger = Rails.logger SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read) Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe: true end
application_controller.rb
before_filter :add_xframe def add_xframe headers['X-Frame-Options'] = 'GOFORIT' end
你需要一个控制器来调用Facebook的canvas设置,我用/canvas/
和路线去这个应用程序的主SiteController
:
class SiteController < ApplicationController def index @user = User.new end def canvas redirect_to '/auth/failure' if request.params['error'] == 'access_denied' url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login" redirect_to url end def login end end
login.html.erb
<% content_for :javascript do %> var oauth_url = 'https://www.facebook.com/dialog/oauth/'; oauth_url += '?client_id=471466299609256'; oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/'); oauth_url += '&scope=email,status_update,publish_stream'; console.log(oauth_url); top.location.href = oauth_url; <% end %>
来源
- 我认为configuration来自omniauth的例子。
- gem文件(这是关键!!!)来自: slideshare我学到的东西…
- 这个堆栈的问题有整个Xframe的angular度,所以你会得到一个空白,如果你不把这个头在应用程序控制器。
- 而我的男人@rafmagana写了这个heroku指南 ,现在你可以采用这个答案的轨道和你走在巨人的肩膀。
目标='_父
使用Kevin Vella的想法,我尝试添加该属性来形成由PayPal的button生成器创build的元素。 为我工作,以便贝宝不会在新的浏览器窗口/选项卡中打开。
FWIW:
当这个“断路器”代码出现时,我们有一种情况需要杀死我们的iFrame
。 所以,我使用了PHP function get_headers($url);
在将其显示在iFrame
之前查看远程URL。 为了获得更好的性能,我将结果caching到一个文件中,所以我没有每次都build立一个HTTP连接。
我尝试了几乎所有的build议。 但是,唯一真正解决问题的是:
-
在PHP文件所在的同一个文件夹中创build一个
.htaccess
文件。 -
将这一行添加到htaccess:
Header always unset X-Frame-Options
之后embedded来自另一个域的iframe。
另外你可以在你的PHP文件的开头添加:
header('X-Frame-Options: ALLOW');
然而,在我的情况下,这是不必要的。
我使用Tomcat 8.0.30,没有任何build议为我工作。 当我们正在寻找更新的X-Frame-Options
,并将其设置为ALLOW
,这里是我如何configuration,以允许embeddediframe:
- 导航到Tomcat conf目录,编辑web.xml文件
- 添加下面的filter:
<filter> <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <init-param> <param-name>hstsEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>antiClickJackingEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>antiClickJackingOption</param-name> <param-value>ALLOW-FROM</param-value> </init-param> <async-supported>true</async-supported> </filter> <filter-mapping> <filter-name>httpHeaderSecurity</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
- 重新启动Tomcat服务
- 使用iFrame访问资源。
如果你得到这个错误的Facebook应用程序,并使用AJAX调用,我读了一个Facebook的地方真的很喜欢使用#标签为它的Ajax接触,所以尝试改变链接,为我工作。
我不确定它有多相关,但是我为此build立了一个解决方法。 在我的网站上,我想显示链接在一个模式窗口,其中包含一个加载url的iframe。
我做的是,我链接到这个JavaScript函数的链接的点击事件。 所有这些都是向一个PHP文件发出一个请求,在决定是在模式窗口中加载URL还是redirect之前,检查X-FRAME-Options的URL标题。
这个function:
function opentheater(link, title){ $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) { if(data == "ya"){ $(".modal-title").html("<h3 style='color:480060;'>"+title+" <small>"+link+"</small></h3>"); $("#linkcontent").attr("src", link); $("#myModal").modal("show"); } else{ window.location.href = link; //alert(data); } }); }
这是检查它的PHP文件代码:
<?php $url = rawurldecode($_REQUEST['url']); $header = get_headers($url, 1); if(array_key_exists("X-Frame-Options", $header)){ echo "nein"; } else{ echo "ya"; } ?>
希望这可以帮助。
运行wordpress网站时遇到了这个问题。 我尝试了各种各样的东西来修复它,并不知道如何,最终这个问题是因为我使用掩码的DNS转发,并没有正确解决到外部网站的链接。 即我的网站托pipe在http://123.456.789/index.html,但被屏蔽在http://somewebSite.com/index.html运行。; 当我在浏览器中inputhttp://123.456.789/index.html时,单击那些相同的链接,导致JS控制台中没有X-frame- origin问题,但运行http://somewebSite.com/index.html 。 为了正确屏蔽,你必须添加主机的DNS域名服务器到你的域名服务,例如godaddy.com应该有名字服务器的例子,ns1.digitalocean.com,ns2.digitalocean.com,ns3.digitalocean.com,如果你是使用digitalocean.com作为您的托pipe服务。
如果您使用Google Plus API
在Google Developers Console中检查Javascript起源,添加http和https地址
使用下面给出的这行代替header()
函数。
echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
令人惊讶的是,这里没有人提到Apache
服务器的设置( *.conf
文件)或.htaccess
文件本身是导致这个错误的原因。 search您的.htaccess
或Apache
configuration文件,确保您没有将以下设置为DENY
:
Header always set X-Frame-Options DENY
将其更改为SAMEORIGIN
,使事情按预期工作:
Header always set X-Frame-Options SAMEORIGIN
如果您使用Content-Security-Policy标头, X-Frame-Options Allow-From https:// …将被折旧并被replace(并被忽略)。
以下是完整的参考资料: https : //content-security-policy.com/
没有提到,但可以在一些情况下帮助:
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);
请确保您启用谷歌地图embeddedapi除了地方的API。
从这里生成你的地图:
https://developers.google.com/maps/documentation/embed/start
同时请确保在您的浏览器中启用第三方Cookie。 花了我几个小时弄清楚了,解决了我的问题。
我有这个问题,并解决它编辑httd.conf
<IfModule headers_module> <IfVersion >= 2.4.7 > Header always setifempty X-Frame-Options GOFORIT </IfVersion> <IfVersion < 2.4.7 > Header always merge X-Frame-Options GOFORIT </IfVersion> </IfModule>
我将SAMEORIGIN更改为GOFORIT并重新启动服务器
尝试这个东西,我不认为任何人在主题中提出这个build议,这将解决你的问题的70%,对于其他一些网页,你必须废除,我有完整的解决scheme,但不是公开的,
添加到您的iframe
sandbox =“allow-same-origin allow-scripts allow-popups allow-forms”
由于Facebook在为应用程序的iFrame获取内容时使用POST,因此您的服务器可能不接受来自Facebook的POST调用。 我知道免费托pipe网站Zymic.com不。 尝试使用Heroku.com。