如何让Sinatra避免添加X-Frame-Options标题?

我正在使用Sinatra返回一些IFRAME内容,我想允许跨域src。 不幸的是,Sinatra会自动为我的回复添加一个X-Frame-Options标题。 我该如何解决这个问题?

Sinatra使用Rack :: Protection ,特别是frame_options选项,这就是设置X-Frame-Options标题。

您可以configuration使用哪些保护 。 Sinatra在默认情况下将其中的大部分开启,(有些仅在您使用会话时启用,而Rack :: Protection本身默认情况下不会启用某些function)。

为了防止发送X-Frame-Options头,你需要像这样禁用frame_options

 set :protection, :except => :frame_options 

另一个解决scheme,我最终在生产中,涉及猴子补丁Rack::Protection::FrameOptions

 # This monkeypatch is needed to ensure the X-Frame-Options header is # never set by rack-protection. module Rack module Protection class FrameOptions < Base def call(env) status, headers, body = @app.call(env) [status, headers, body] end end end end 

这里提出的两个选项都不适用于我的sinatra应用程序。 我最终添加了一个afterfilter来修改X-Frame-Options标题,以允许应用程序被Facebook框起来。

 after do headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' }) end 

使用Sinatra-1.3.3“set:protection,:except =>:frame_options”答案不适用于我

我必须破解一个解决scheme; 我把这mutha在我的config.ru文件。 Obvs你可以改变标题是任何你想要的。

config.ru

 class Rack::Protection::FrameOptions def header @header ||= {} end end 

我想我find了一个很好的方法来处理这个问题,但会欢迎反馈意见

我们的目标是为了保持所有的机架保护优势而禁用X-Frame-Options。

  app.get'/hello_world' do headers({ 'X-Frame-Options' => '' }) "HELLO WORLD" end 

我相信这是一个不错的select,因为它似乎阻止机架保护在这条路线上添加SAMEORIGIN标头

实际上,@matt给出的解决scheme仍然在使用Sinatra v1.4.5。

是的,Sinatra使用Rack :: Protection并根据configuration攻击保护

你可以完全禁用保护(这是不推荐的):

 disable :protection 

或者只禁用frame_options:

 set :protection, :except => :frame_options 

除此之外,如果你的问题不是因为X-Frame-Options ,它可能是Access-Control-Allow-Origin ,那么你必须做的是在返回语句之前在你的路由中添加下面的行:

 response['Access-Control-Allow-Origin'] = 'http://www.example.com/'