Ruby on rails 4 app在iframe中不起作用

时间:2013-05-15 09:12:11

标签: ruby-on-rails ruby-on-rails-3 iframe ruby-on-rails-4

如何通过iframe将我的rails应用程序嵌入到另一个网站?

它与RoR 3很好地配合,但不适用于RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>

我尝试在我的控制器中使用verify_authenticity_tokenprotect_from_forgery选项...似乎是别的(但我不确定)。

UPD。例: http://jsfiddle.net/zP329/

4 个答案:

答案 0 :(得分:100)

这与Rails 4默认启用其他安全协议有关:http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

在远程站点上破坏iFrame的设置是X-Frame-Options。默认情况下,此设置为SAMEORIGIN,可防止内容加载跨域:

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'SAMEORIGIN'
}

您可以在此处阅读有关新默认标头的信息: http://edgeguides.rubyonrails.org/security.html#default-headers

为了让iFrame能够跨域工作,您可以更改默认标头以允许跨域使用X-Frame。

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}

答案 1 :(得分:47)

Rails 4 added默认X-Frame-Options HTTP标头值SAMEORIGIN。这对安全性有好处,但当您希望在action中调用iframe时,您可以这样做:


允许所有来源:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end


允许特定原产地:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-origin.com"
    render_something
  end
end


使用:after_filter

当您需要在action中使用多个iframe时,最好使用:after_filter制作方法并调用它:

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end

在控制器中使用它,如下所示:

class MyController < ApplicationController
  after_filter :allow_iframe, only: [:basic_embed, :awesome_embed]

  def basic_embed
      render_something
  end

  def awesome_embed
      render_something
  end

  # Other Actions...
end

通过:Rails 4: let specific actions be embedded as iframes

答案 2 :(得分:0)

我正在使用Rails 6和Chromium76。以前的X-Frame-Options解决方案不起作用。但是我注意到,当我们将在线iframe与JS附加在一起时,它的效果很好。因此,我认为这个解决方案很简单:

<div id='iframe_wrapper' 'data-iframe-content'='<iframe src="https://host.com/"></iframe>'>
</div>

...并添加这样的JS代码:

$(document).ready(function() {
  var wrapper = $('#iframe_wrapper')[0]
  wrapper.innerHTML = wrapper.attributes['data-iframe-content'].value
})

答案 3 :(得分:0)

更新:似乎 ALLOW-FROM 和 ALLOWALL 目前都是无效的“X-Frame-Options”标头值。只有两个有效的是 DENY 和 SAMEORIGIN,它们都不允许从另一个来源访问。请参阅 MDN 文档:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

看起来 response.headers.delete "X-Frame-Options" 是现在在其他网站的 iframe 中显示内容的唯一方法。但如果有人知道我不知道的任何知识,我很乐意得到证明。