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

Ole*_*sko 56 iframe ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

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

它适用于RoR 3,但不适用于RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>
Run Code Online (Sandbox Code Playgroud)

我试图在我的控制器中使用verify_authenticity_tokenprotect_from_forgery选项...似乎它是另一回事(但我不确定).

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

小智 100

这与轨道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'
}
Run Code Online (Sandbox Code Playgroud)

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

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

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}
Run Code Online (Sandbox Code Playgroud)

  • "ALLOWALL"未指定为X-Frame-Options的选项:https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options.是不是可以删除标题? (10认同)
  • 我还应该提到chrome将缓存旧值,因此您需要在开发中禁用chrome缓存. (3认同)

She*_*yar 47

Rails 4 添加了默认的X-Frame-OptionsHTTP标头值SAMEORIGIN.这是很好的安全性,但是当你希望你action在一个被称为iframe,你可以这样做:


允许所有来源:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end
Run Code Online (Sandbox Code Playgroud)


允许特定原产地:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-origin.com"
    render_something
  end
end
Run Code Online (Sandbox Code Playgroud)


使用:after_filter

当你需要使用多个actionin中的一个时iframe,最好制作一个方法并用它来调用它:after_filter:

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

Via:Rails 4:让特定的动作嵌入为iframe