2010-10-18 63 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

相關問題