3

我正在与 Sinatra 一起构建 Grape API。到目前为止,我一直将它们安装在不同的路线中,如下所示:

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

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

在此先感谢您的帮助。

4

1 回答 1

0

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

你也可以自己动手:

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 
于 2013-10-25T08:58:57.147 回答