我希望允许任何人通过 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'
- 它也不起作用。
您尝试过设置frame_ancestors吗?
# config/initializers/content_security_policy.rb
Rails.application.config.content_security_policy do |policy|
policy.frame_ancestors :self, "*"
end
使用 Rails
content_security_policy
帮助程序配置 HTTP Content-Security-Policy 响应标头。直接在您希望在 iframe 中允许的控制器中使用它:
class AllowInIFrameController
content_security_policy do |f|
f.frame_ancestors "*"
end
def iframe; end
end