ruby-on-rails-5 - 无法使用 rack-cors 在另一个域上呈现 iframe
问题描述
我正在尝试在 App B 中呈现 App A 的 iframe。
- 应用 A 是本地 Rails 5.0 应用,使用 https。
- 应用 B 托管在 Heroku 上并使用 https。
我已经尝试实现rack-cors
gem 但没有成功,并且我已经尝试了在 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'.
解决方案
我不确定这是否专门针对 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 行和功能代码放在应用程序控制器中,但我建议将其仅限于特定页面/控制器。
推荐阅读
- angular - 角度中没有将“exportAs”设置为“ngForm”的指令
- vb.net - 如何解决错误:“列名或提供的值的数量与表定义不匹配”?
- kubernetes - AKS cilium 单节点集群不接受连接
- javascript - RangeError:超过最大调用大小,创建条带会话
- php - 拉拉维尔。如果数据库正在播种,则禁用观察者方法
- javascript - 在 JQuery 中从 JSON 中过滤子字符串
- excel - waitForResponse 方法不适用于 XMLHTTP
- reactjs - 如何在不同的反应应用程序之间共享节点模块文件夹
- arrays - 如何在本机反应中循环返回多张卡
- angular - 如何在 Angular 11 中从 Angular Material CDK 调用 CdkTable 上的“renderRows”