【问题标题】:Ruby on rails 4 app does not work in iframeRuby on rails 4 应用程序在 iframe 中不起作用
【发布时间】:2013-05-09 18:57:24
【问题描述】:

如何通过 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 选项...似乎是别的东西(但我不确定)。

更新。例子: http://jsfiddle.net/zP329/

【问题讨论】:

  • 为什么是 iframe?绝对没有更好的选择吗?使用嵌入式 JS 小部件通过 AJAX 访问您的站点数据?
  • 对我来说,一位同事正在将我的应用程序加载到他自己的个人 IFrame 的 HTML 页面中,该页面加载了他的几个日常站点和工具。 jcypret 的回答正是我所需要的

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


【解决方案1】:

更新:似乎 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 中显示内容的唯一方法。但是,如果有人知道我不知道的任何知识,我很乐意得到证明。

【讨论】:

    【解决方案2】:

    我正在使用 Rails 6 和 Chromium 76。以前使用 X-Frame-Options 的解决方案不起作用。但是我注意到,当我们使用 JS 附加在线 iframe 时,它​​的效果非常好。所以,在我看来,我只是做了这个简单的解决方案:

    <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】:

      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

      【讨论】:

        【解决方案4】:

        这与 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'
        }
        

        【讨论】:

        • 更改配置后,您的浏览器可能仍会缓存旧的标头。您可以通过在隐身/私人窗口中打开您的 iframe 来确保它没有。
        • "ALLOWALL" 未指定为 X-Frame-Options 的选项:developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options。是不是可以去掉header?
        • 我还要提一下 chrome 会缓存旧值,所以你需要在开发中禁用 chrome 缓存。
        • 在 Chromium 和 Firefox 中使用空白字符串而不是 ALLOWALL 有效。
        猜你喜欢
        • 2017-11-09
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 2018-02-26
        相关资源
        最近更新 更多