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

我在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配置来实现这个function?

解决此问题的一种简单方法是在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