将请求从域发送到特定 Rails 引擎

Send Requests from Domain to Specific Rails Engine

我在 Rackspace VPS 上有一个 rails 应用程序 运行。栈是 rails3 + unicorn + nginx + mysql.

有一个 primary 域使用 proxy_pass 将流量直接发送到 unicorn 套接字。

我开发了一个安装在 /digital 下的新引擎。现在,人们可以通过 http://primarydomain.com/digital.

与该引擎进行交互

我想托管一个将请求直接转发到 /digital 的新域;不是根引擎。

因此,例如,以下请求将产生相同的结果:

http://primarydomain.com/digital/splash
http://alternatedomain.com/splash

在完美的世界中,引擎将是一个单独的应用程序。我想把单独的域当作一个单独的应用程序,尽管它实际上是一个已安装的引擎。

这是 routes.rb 的样子:

Company::Application.routes.draw do
  root :to => 'spree/home#splash'

  ActiveAdmin.routes(self)

  mount Core::Engine, :at => '/'
  mount Another::Engine, :at => '/digital'
end

我需要什么 rails + nginx 配置才能让它工作?

解决此问题的一个简单方法是在 Rails 内使用路由约束。事实上,在引擎中包含应用程序的各个部分会使它变得更加简单。

Company::Application.routes.draw do

  mount Core::Engine,    at: '/', constraints: { domain: 'coredomain.com' }
  mount Another::Engine, at: '/', constraints: { domain: 'anotherdomain.com' }

  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)

end

确保引擎支架在路线中排在第一位,以便它们的路线优先于 ActiveAdmin 添加的任何内容。

现在您只需将两个域都指向带有 nginx 的应用程序即可。

如果你想让它在 coredomain.com/digital 下工作,你甚至可以挂载 Another::Engine 两次:

Company::Application.routes.draw do

  constraints domain: 'coredomain.com' do
    mount Core::Engine, at: '/'
    mount Another::Engine, at: '/digital'
  end

  constraints domain: 'anotherdomain.com' do
    mount Another::Engine, at: '/'
  end

  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)

end