将多个域名映射到Rails应用程序中的不同资源

时间:2010-10-18 11:30:42

标签: ruby-on-rails apache passenger

我拥有的rails应用程序允许用户管理度假屋。每个房产都有自己的房产 我的应用程序中的“网站/主页”和用户可以调整内容,它运作良好, 到目前为止很高兴。典型的rails接近资源,因此特定属性的URL对于特定属性的“主页”看起来像这样。

localhost:3000/properties/1/

然后

localhost:3000/properties/1/full_details
localhost:3000/properties/1/price_list

要求是映射域名,例如www.chalet-yeti.com并将其解析(重写?)到localhost:3000 / properties / 1 /

同样也是......

www.chalet-yeti.com/full_details  -> localhost:3000/properties/1/full_details

下一位用户添加了一个属性,我代表他们注册了一个新名称,我当然希望这样做..

www.apartment-marie.com  -> localhost:3000/properties/2/

这可能/可行/可行在同一个rails应用程序中吗?到目前为止,解决方案的范围从“你为什么这样做”到“使用mod_proxy / mod_rewrite / virtual_host config”的变体。如果重要的话,应用程序在我的服务器上的apache和乘客下运行。

我不想抢先回答,但到目前为止大多数人似乎都指向apache配置,大多数人说我正在尝试的并非不可能/不可取。真的希望有人能够至少指出我正确的方向,因为我整个上午都在摸不着头脑。出于我的舒适区域,我希望我可以启动我的应用程序,并且没有花费六周时间建造一头白象!除非我能做这个URL的事情,否则它已经死了!

2 个答案:

答案 0 :(得分:1)

http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails

这就是你想要的。不要乱用apache。它不会扩展到数百个域,并且容易破损。

答案 1 :(得分:-1)

在Rails中,你应该想到只有URI的请求,没有主机名部分。也就是说,您需要考虑localhost:3000/properties/1/full_details,而不是/properties/1/full_detailslocalhost:3000部分只是为了在开发过程中向Mongrel提出请求。

所以你真正想要的是接收HTTPd(Apache,在你的情况下)收到的请求,并提取一些信息来构造给Rails的请求。

mod_rewrite,这是一个Apache模块,是实现这一目标的理智方式。

您需要确保运行Rails应用程序的同一虚拟主机接受您正在使用的所有域名的请求。

然后你可以使用mod_rewrite做这样的事情:

RewriteCond %{HTTP_HOST} ^(www.)?chalet-yeti\.com$
RewriteRule ^(.*)$ /properties/1/$1 [L]

这会将每个请求发送到主机chalet-yeti.com(或www.chalet-yeti.com)并将其作为“/ properties / 1 / $ 1”传递给Rails(其中$ 1是任何其他路径,如full_details)。

对于每个域,您都需要一个这样的块,但这只是Apache配置中的两行。除非你做了数百个域名,否则它应该是可以容忍的,对吗?