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

时间:2015-01-13 21:19:09

标签: ruby-on-rails ruby-on-rails-3 nginx unicorn

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

有一个主域使用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配置才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

解决此问题的一种简单方法是在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指向这两个域,你就可以了。

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

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