442

我正在编写一个小网页,其目的是构筑其他一些页面,只是将它们合并到一个浏览器窗口中以便于查看。我试图框住的一些页面禁止被框住并抛出“拒绝显示文档,因为 X-Frame-Options 禁止显示”。Chrome 中的错误。我知道这是一个安全限制(有充分的理由),并且无权更改它。

是否有任何替代框架或非框架方法可以在不会被 X-Frame-Options 标题绊倒的单个窗口中显示页面?

4

27 回答 27

217

我有一个类似的问题,我试图在 iframe 中显示我们自己网站的内容(作为带有Colorbox的灯箱样式对话框),并且我们在服务器范围内有一个“X-Frame-Options SAMEORIGIN”标题源服务器阻止它加载到我们的测试服务器上。

这似乎没有记录在任何地方,但是如果您可以编辑您尝试 iframe 的页面(例如,它们是您自己的页面),只需发送另一个带有任何字符串的 X-Frame-Options 标头即可禁用SAMEORIGIN 或 DENY 命令。

例如。对于 PHP,把

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

在您的页面顶部将使浏览器将两者结合起来,从而导致标题为

X-Frame-Options SAMEORIGIN, GOFORIT

...并允许您在 iframe 中加载页面。当初始 SAMEORIGIN 命令设置在服务器级别时,这似乎有效,并且您希望逐页覆盖它。

祝一切顺利!

于 2011-07-20T20:13:27.637 回答
162

如果您在 YouTube 视频中收到此错误,请使用共享选项中的嵌入网址,而不是使用完整网址。它看起来像http://www.youtube.com/embed/eCfDxZxTBW4

您也可以替换watch?v=embed/http://www.youtube.com/watch?v=eCfDxZxTBW4http://www.youtube.com/embed/eCfDxZxTBW4

于 2011-12-15T14:01:35.697 回答
122

如果您在尝试将 Google 地图嵌入到 中时遇到此错误,则iframe需要添加&output=embed到源链接。

于 2011-09-19T11:09:44.720 回答
74

2019 年更新:可以仅使用客户端 JavaScript 和我的X-Frame-OptionsX -Frame-Bypass Web组件绕过。这是一个演示:Hacker News in an . (在 Chrome 和 Firefox 中测试。)<iframe>X-Frame-Bypass

于 2014-08-30T23:05:39.393 回答
28

Chrome 有一个插件,可以删除该标题条目(仅供个人使用):

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

于 2014-08-07T12:22:36.777 回答
23

添加一个

  target='_top'

到我在 facebook 选项卡中的链接为我解决了这个问题......

于 2012-08-24T11:40:41.577 回答
21

如果您在尝试嵌入 Vimeo 内容时遇到此错误,请将 iframe 的 src

从:https
://vimeo.com/63534746 更改为: http: //player.vimeo.com/video/63534746

于 2013-05-31T16:26:34.333 回答
13

当我尝试将moodle 2嵌入iframe时遇到同样的问题,解决方案是Site administration ► Security ► HTTP security并检查Allow frame embedding

于 2012-04-16T12:28:53.967 回答
8
于 2018-02-20T09:50:19.943 回答
7

这是解决方案伙计们!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

唯一适用于 Facebook 应用程序的东西!

于 2013-01-21T14:16:36.197 回答
7

我尝试了几乎所有的建议。然而,唯一真正解决问题的是:

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

  2. 将此行添加到 htaccess:

    Header always unset X-Frame-Options

之后应该可以通过来自另一个域的 iframe 嵌入 PHP。

此外,您可以在 PHP 文件的开头添加:

header('X-Frame-Options: ALLOW');

然而,在我的情况下,这不是必需的。

于 2016-09-02T18:48:57.493 回答
7

如果您改用Content-Security-Policy标头,则X-Frame-Options Allow-From https://...似乎已被折旧并被替换(并被忽略)。

以下是完整参考:https ://content-security-policy.com/

于 2017-06-14T12:25:21.630 回答
4

我对 mediawiki 也有同样的问题,这是因为服务器出于安全原因拒绝将页面嵌入到 iframe 中。

我解决了它写作

$wgEditPageFrameOptions = "SAMEORIGIN"; 

进入 mediawiki php 配置文件。

希望能帮助到你。

于 2013-03-09T23:01:18.187 回答
3

FWIW:

iFrame当这个“破坏者”代码出现时,我们需要杀死我们的情况。因此,我使用 PHPfunction get_headers($url);在将远程 URL 显示为iFrame. 为了获得更好的性能,我将结果缓存到一个文件中,这样我就不会每次都建立 HTTP 连接。

于 2012-03-19T03:43:37.147 回答
3

我使用的是 Tomcat 8.0.30,没有任何建议对我有用。当我们正在寻找更新X-Frame-Options并将其设置为 时ALLOW,这是我配置为允许嵌入 iframe 的方式:

  • 导航到 Tomcat conf 目录,编辑 web.xml 文件
  • 添加以下过滤器:
<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 访问资源。
于 2016-12-08T16:34:59.270 回答
2

唯一有一堆答案的问题。欢迎来到我希望在我努力让它在截止日期晚上 10:30 工作时拥有的指南……FB 用画布应用程序做了一些奇怪的事情,好吧,你已经被警告过了。如果您还在这里,并且您有一个将出现在 Facebook Canvas 后面的 Rails 应用程序,那么您将需要:

宝石文件:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

配置/facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

配置/应用程序.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

配置/初始化程序/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/并让这条路线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

登录.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 %>

来源

  • 我认为的配置来自omniauth的例子。
  • gem 文件(这是关键!!!)来自:slideshare 我学到的东西......
  • 这个堆栈问题有整个 Xframe 角度,所以如果你不把这个标题放在应用程序控制器中,你会得到一个空白区域。
  • 我的人@rafmagana 写了这个heroku 指南,现在你可以用这个答案和你走路的巨人的肩膀来采用它。
于 2013-08-03T02:12:04.057 回答
2
<form target="_parent" ... />

使用 Kevin Vella 的想法,我尝试在 PayPal 的按钮生成器制作的表单元素上使用上述内容。为我工作,以便 Paypal 不会在新的浏览器窗口/选项卡中打开。

更新

这是一个例子:

从今天(2021 年 1 月 19 日)开始生成一个按钮,PayPal 会自动包含target="_top"在该form元素上,但如果这不适用于您的上下文,请尝试不同的target值。我建议_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>
于 2014-02-21T18:22:29.210 回答
2

The only real answer, if you don't control the headers on your source you want in your iframe, is to proxy it. Have a server act as a client, receive the source, strip the problematic headers, add CORS if needed, and then ping your own server.

There is one other answer explaining how to write such a proxy. It isn't difficult, but I was sure someone had to have done this before. It was just difficult to find it, for some reason.

I finally did find some sources:

https://github.com/Rob--W/cors-anywhere/#documentation

^ preferred. If you need rare usage, I think you can just use his heroku app. Otherwise, it's code to run it yourself on your own server. Note sure what the limits are.

whateverorigin.org

^ second choice, but quite old. supposedly newer choice in python: https://github.com/Eiledon/alloworigin

then there's the third choice:

http://anyorigin.com/

Which seems to allow a little free usage, but will put you on a public shame list if you don't pay and use some unspecified amount, which you can only be removed from if you pay the fee...

于 2018-04-26T22:26:57.960 回答
1

我不确定它有多相关,但我为此建立了一个解决方法。在我的网站上,我想在包含加载 URL 的 iframe 的模式窗口中显示链接。

我所做的是,我将链接的点击事件链接到这个 javascript 函数。所有这些都是向 PHP 文件发出请求,该文件检查 URL 标头中的 X-FRAME-Options,然后再决定是在模式窗口中加载 URL 还是重定向。

这是功能:

  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";
}


?>

希望这可以帮助。

于 2013-12-19T11:01:23.733 回答
1

我在运行 wordpress 网站时遇到了这个问题。我尝试了各种方法来修复它,但不确定如何解决,最终问题是因为我使用了带有掩码的 DNS 转发,并且没有正确处理指向外部站点的链接。即我的网站托管在http://123.456.789/index.html但被掩盖在http://somewebSite.com/index.html运行。当我在浏览器中输入http://123.456.789/index.html时,单击这些相同的链接导致 JS 控制台中没有 X-frame-origins 问题,但运行http://somewebSite.com/index.html做过。为了正确屏蔽,您必须将主机的 DNS 名称服务器添加到您的域服务中,即 godaddy.com 应该具有例如 ns1.digitalocean.com、ns2.digitalocean.com、ns3.digitalocean.com 的名称服务器,如果您是使用 digitalocean.com 作为您的托管服务。

于 2014-06-03T00:02:29.217 回答
1

令人惊讶的是,这里没有人提到Apache服务器的设置(*.conf文件)或.htaccess文件本身是导致此错误的原因。搜索您的.htaccessApache配置文件,确保您没有将以下设置设置为DENY

Header always set X-Frame-Options DENY

将其更改为SAMEORIGIN,使事情按预期工作:

Header always set X-Frame-Options SAMEORIGIN

于 2015-08-05T11:14:53.320 回答
0

使用下面给出的这一行而不是header()函数。

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
于 2013-10-07T10:54:33.410 回答
0

未提及,但在某些情况下可以提供帮助:

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);
于 2014-03-19T06:22:18.830 回答
0

我有这个问题,并解决它编辑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 并重新启动服务器

于 2015-08-11T13:58:53.433 回答
0

Edit .htaccess if you want to remove X-Frame-Options from an entire directory.

And add the line: Header always unset X-Frame-Options

[contents from: Overcoming "Display forbidden by X-Frame-Options"

于 2019-07-16T13:12:00.820 回答
0

Site owners use the X-Frame-Options response header so that their website cannot be opened in an Iframe. This helps to secure the users against clickjacking attack

There are a couple of approaches that you can try if you want to disable X-Frame-Options on your own machine.

Configuration at Server-Side

If you own the server or can work with the site owner then you can ask to set up a configuration to not send the Iframe buster response headers based on certain conditions. Conditions could be an additional request header or a parameter in the URL.

For example - The site owner can add an additional code to not send Iframe buster headers when the site is opened with ?in_debug_mode=true query param.

Use Browser extension like Requestly to remove response headers

You can use any browser extension like Requestly which allows you to modify the request & response headers. Here's a Requestly blog that explains how to embed sites in Iframe by bypassing Iframe buster headers.

enter image description here

Configure a Pass-through Proxy and remove headers from it

If you need to bypass Iframe buster headers for multiple folks, then you can also configure a pass-through proxy that just removes the frame buster response headers and return back the response. This is however a lot complicated to write, set up. There are some other challenges like authentication etc with the sites opened in Iframe through a proxy but this approach can work for simple sites pretty well.

PS - I have built both solutions and have first-hand experience with both.

于 2022-01-31T10:08:26.817 回答
-1

试试这个东西,我认为没有人在主题中提出这个建议,这将解决你 70% 的问题,对于其他一些页面,你必须废弃,我有完整的解决方案,但不公开,

在下面添加到您的 iframe

sandbox="allow-same-origin 允许脚本允许弹出窗口允许表单"

于 2017-10-02T07:59:41.487 回答