机架应用程序安装在不同的子域中

时间:2013-10-25 06:45:40

标签: ruby sinatra rack grape

我正在和Sinatra一起建立一个Grape API。到目前为止,我一直将它们安装在这样的不同路线中:

run Rack::URLMap.new("/" => Frontend::Server.new,
                     "/api" => API::Server.new)

“/ api”由Grape应用程序提供,“/”由Sinatra应用程序提供。但我想使用子域来区分这些问题而不是实际的“子URL”。关于如何做到这一点的任何线索?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

有一个rack-subdomain gem,但它只处理重定向到路径,而不是机架应用程序。您可以将其分叉并将其重定向到机架应用程序。

你也可以自己动手:

class SubdomainDispatcher
  def initialize
    @frontend = Frontend::Server.new
    @api      = API::Server.new
  end

  def call(env)
    if subdomain == 'api'
      return @api.call(env)
    else
      return @frontend.call(env)
    end
  end

  private

  # If may be more robust to use a 3rd party plugin to extract the subdomain
  # e.g ActionDispatch::Http::URL.extract_subdomain(@env['HTTP_HOST'])
  def subdomain
    @env['HTTP_HOST'].split('.').first
  end
end


run SubdomainDispatcher.new