首页 文章

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

提问于
浏览
55

如何通过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 选项......似乎's something else (but I'我不确定) .

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

2 回答

  • 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'
    }
    
  • 47

    Rails 4 added缺省 X-Frame-Options HTTP标头值 SAMEORIGIN . 这对安全性有好处,但是如果你想在 iframe 中调用 action ,你可以这样做:


    允许所有来源:

    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

    当您需要在 iframe 中使用多个 action 时,最好创建一个方法并使用 :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

相关问题