Rails 5:安装在routes.rb 中的Rack 应用绕过Rails 中间件?

Rails 5: Rack app mounted in routes.rb bypasses Rails middleware?

我的 routes.rb 中安装了一些 Rack 应用程序,如下所示:

mount ImageVise, at: '/ivise'
mount ShaderApiV0, at: '/api/v0'

我目前正在从 spaghetti 自定义 Rack 堆栈迁移到 Rails,因此保留这些应用程序对我来说很有意义。我注意到当我调用控制器时,在应用程序上定义的整个 Rails 中间件堆栈(包括我的 Rack::Cache 设置)确实起作用,但是 没有 当我调用由 mini-apps 控制的 URL 时起作用。我几乎可以肯定 Rails 4 它确实有效。

例如,如果我像这样引入自定义中间件:

class Mittel < Struct.new(:app)
  def call(env)
    a, b, c = app.call(env)
    b['X-Kustom'] = 'olala'
    [a,b,c]
  end
end
config.middleware.insert_before Rack::Head, Mittel

当我请求由 Rails 控制器驱动的 URL 时,我确实看到 X-Kustom 响应 header,但我 没有 当我请求由安装的 mini-apps 控制的 URL 之一时得到它。因此,条件 GET 和类似的东西不起作用等。除了在 config.rb 中复制三分之一的 Rails 中间件堆栈并将这些应用程序安装在那里之外,我怎样才能让它工作?

找到了。事实证明,我也在 config.ru 中安装了这些应用程序之一,在相同的 URL 下 - 然后当然会绕过整个 Rails 堆栈,这是应该的。吸取教训。