2010-10-18 56 views
2

Rails应用程序我都允许用户管理的度假屋。每个属性都有自己的 “网站/主页”在我的应用程序和用户可以调整内容,它运作良好, 到目前为止相当高兴。典型的rails接近资源,所以特定属性的URL看起来像这样用于特定属性的“主页”。映射多个域名不同资源的Rails应用程序

localhost:3000/properties/1/ 

然后

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

要求是例如映射域名www.chalet-yeti.com并将它解析(重写?)为localhost:3000 /属性/ 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配置”的变体。万一它的问题应用程序运行在我的服务器上的apache和乘客。

我不想越俎代庖一个答案,但多数人至今似乎指向Apache的配置和最说什么我试图也不是不可能/不可取的。真的希望有人能够至少指向正确的方向,因为我整个早上都在挠头。在我的舒适区内,我希望我可以启动我的应用程序,并且没有花六周的时间建造一头白色的大象!除非我可以做这个URL的东西,它已经死了!

回答

-1

轨之内,你应该觉得就是来一个URI请求,没有主机名部分。也就是说,您需要考虑/properties/1/full_details而不是localhost:3000/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”(其中$ 1是任何其他路径,如full_details)。

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

+0

尽管事实上我可以得到一个测试重写规则来工作,但是我无法获得示例中的重写代码 - 仅仅被忽略。哎呀。 – user294940 2010-10-18 13:15:18

+0

啊,那是因为我没有正确编辑我的复制粘贴。我在域名之前有一个额外的'!',这意味着它应用于所有其他域名,而不是正确域名。我现在编辑它。抱歉。 – pjmorse 2010-10-18 13:33:07

+0

好的,但*仍然*不操作 - 只是没有做什么,我的意思是我最终在网站的根网址。如果我将[L]更改为[R],则最终会出现重定向循环,但至少我认为规则正在处理中。 – user294940 2010-10-18 13:53:52

1

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

这就是你想要的。不要为这个惹麻烦。它不会扩展到数百个域,并且容易破损。

+0

我听到你的声音,但我想知道* apache的方法是多么糟糕,我理解pjmorse的apache配置答案,它绝对可以容忍,不太可能会做很多域。 – user294940 2010-10-18 12:44:38

+0

这看起来很有趣,但并不完全是我想要做的,我仍然没有看到告诉rails应用程序显示www.mydomainname.com/full_details而不是/ localhost/properties/1/full_details – user294940 2010-10-18 13:14:30

+0

我认为你是对的,这是最简单的方式来做到这一点,但这个应用程序并不期望以这种方式得到它的论点。使用这种方法需要开发人员考虑从一开始就从请求中获取这些数据。 – pjmorse 2010-10-18 13:35:45

相关问题