首页 > 解决方案 > 无法使用 rack-cors 在另一个域上呈现 iframe

问题描述

我正在尝试在 App B 中呈现 App A 的 iframe。

我已经尝试实现rack-corsgem 但没有成功,并且我已经尝试了在 StackOverflow 上可以找到的所有建议。

我的cors.rb文件,在 App A 中:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://app-b.herokuapp.com'
    resource '/url/on/app_a/*',
             headers: :any,
             methods: :any
  end
end

我的config.ru文件(我试过有没有这个):

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
require 'rack/cors'

use Rack::Cors do
  allow do
    origins 'https://app-b.herokuapp.com'
    resource '/url/on/app_a/*',
             headers: :any,
             methods: :any
  end
end

我得到的错误是:Refused to display 'https://app-a.com/' in a frame because it set 'X-Frame-Options' to 'sameorigin'.

标签: ruby-on-rails-5x-frame-optionsrack-cors

解决方案


我不确定这是否专门针对 rack-cors,但我知道标题“X-Frame-Options”至少在 Rails 5 中被故意设置为“sameorigin”。最有可能防止开发人员无意中允许某人将他们的服务器包装在 iframe 中。

根据文档,我们可以看到如果服务器将此响应设置为不“同源”,则浏览器将允许 HTML 代码运行。所以我们需要的是删除那个标题。Chris Peters 在这篇文章中做得很好。保存点击

class SomeController < ApplicationController
  after_action :allow_iframe

  
  private

  def allow_iframe
    response.headers.except! 'X-Frame-Options'
  end
end

要将其应用于所有端点,只需将 after_action 行和功能代码放在应用程序控制器中,但我建议将其仅限于特定页面/控制器。


推荐阅读