Rails 6. 允许任何其他域将特定页面嵌入到 iFrame 中

问题描述 投票:0回答:2

我希望允许任何人通过 iFrame 嵌入我的 Rails 网站。但我只想开通一些特定的路线,比如

/emded/entity1/:entity1_id
/emded/entity2/:entity2_id

例如,Youtube 就是这样做的。 我可以嵌入以下代码:

<iframe width="420" height="315"src="https://www.youtube.com/embed/tgbNymZ7vqY">
</iframe>

但是如果我将

src
属性更改为
https://www.youtube.com/
,这个 iframe 将不会显示任何内容。

在 Rails 中如何做同样的事情?

我尝试遵循为 Rails 4 找到的指南: http://jerodsanto.net/2013/12/rails-4-let-specific-actions-be-embedded-as-iframes/

我在应用程序控制器中创建了一个方法:

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

然后我将其添加到控制器中,并使用显示 iframe 内容(页面)的操作。 after_action :allow_iframe, 仅: :show_page_in_iframe

这是控制器操作本身:

  def show_page_in_iframe
    ...
    
    respond_to do |format|
      format.html { render layout: 'iframe' }
    end
  end

然后我将这些更改部署到生产环境,将带有相应 URL 的 iframe 嵌入到“localhost”页面。

<iframe src="https://www.example.com/entity1/embed/66efdc3e-7cb7-436d-98e8-63275fa74ebd" height="500" width="100%" style="border:0"></iframe>

但是在 Chrome 控制台中我可以看到

Refused to display 'https://www.example.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.
错误消息。

我在这里做错了什么?这种方法对于 Rails 6 仍然可行吗?

更新1。

localhost
中进行一些调试后,我发现仅当控制器操作中恰好有
response.headers.delete "X-Frame-Options"
行时,才会删除“X-Frame-Options”值。但将这些更改部署到生产 (Heroku) 并没有解决问题。

更新2。 另外,我尝试为

ALLOWALL
设置
X-Frame-Options
值 - 它也没有帮助我。

更新3. 另外,我尝试用另一种方式删除

X-Frame-Options
response.headers.except! 'X-Frame-Options'
- 它也不起作用。

ruby-on-rails iframe ruby-on-rails-6 x-frame-options
2个回答
1
投票

您尝试过设置frame_ancestors吗?

# config/initializers/content_security_policy.rb    
Rails.application.config.content_security_policy do |policy|
  policy.frame_ancestors :self, "*"
end

0
投票

使用 Rails

content_security_policy
帮助程序配置 HTTP Content-Security-Policy 响应标头。直接在您希望在 iframe 中允许的控制器中使用它:

class AllowInIFrameController
  content_security_policy do |f|
    f.frame_ancestors "*"
  end

  def iframe; end
end
© www.soinside.com 2019 - 2024. All rights reserved.