克服“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=embediframe出现此错误,则需要将&output=embed添加到源链接。

可以使用客户端JavaScript和YQL绕过<iframe>中的X-Frame-Options 。 这是一个概念certificate: 黑客新闻在<iframe> 。 (在Chrome浏览器和Firefox浏览器中进行testing;如果不起作用,请尝试刷新页面。)

过程如下:

  1. 从YQL(函数loadURL )请求一个iframe URL,
  2. 从YQL获取HTML数据(函数getData ),
  3. 使用YQL在iframe中添加<base link><script>加载链接,
  4. 将这个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有一个插件,用于删除该标题条目(仅供个人使用):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews

当我尝试在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/初始化/ omn​​iauth.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议。 但是,唯一真正解决问题的是:

  1. 在PHP文件所在的同一个文件夹中创build一个.htaccess文件。

  2. 将这一行添加到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+"&nbsp;&nbsp;&nbsp;<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地址

http://myawesomedomainname.com

https://myawesomedomainname.com

使用下面给出的这行代替header()函数。

 echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>"; 

令人惊讶的是,这里没有人提到Apache服务器的设置( *.conf文件)或.htaccess文件本身是导致这个错误的原因。 search您的.htaccessApacheconfiguration文件,确保您没有将以下设置为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。