2012-05-03 126 views
10

我想創建一個示例SaaS應用程序,用戶可以通過它來註冊,創建網頁,使用模板和/或使用自定義CSS自定義它們,爲其網頁提供服務關閉自定義域。如何在Saas App中提供指向子域名的自定義域名

我正在考慮將模板保存在S3 /其他CDN上,以及媒體/樣式表/ js文件。雖然所有技術上都是可能的(實際可能會有爭議)。無論如何,我很難弄清楚在這種情況下網站將如何在自定義域名上投放?例如,他們在註冊時可以獲得subdomain.domain.com地址。然而,他們怎麼一點customerdomain.com使得進入customerdomain.com時,提供相同的內容customerdomain.domain.com,和URL仍然customerdomain.com

另外,如果我想有一個「feature」,由此,自定義域可能是一項付費功能。我將如何將其限制爲僅限付費用戶?

通常,當我們設置網站時,我們在虛擬主機配置文件(apache)中指定它,並給它別名,以便它查找並提供別名。在這種情況下,我不想爲每個註冊的人都有一個單獨的虛擬主機文件。有其他選擇嗎?我該如何編程?有什麼需要注意的嗎?

我看到的一種解決方案是讓服務器爲通配符域服務,即*.domain.com,併爲每個自定義域分別設置一個虛擬主機,但是如果可以的話,我寧願避免。

謝謝。

回答

6

自定義域通常通過CNAME DNS記錄(對DNS記錄的符號鏈接進行排序)完成。您告訴您的客戶(誰通常控制着customerdomain.com)創建一個CNAME記錄,說明customerdomain.com是customerdomain.domain.com的別名。然後,您需要設置自己的服務器來解析與customerdomain.domain.com的請求相同的對customerdomain.com的請求。

取決於您如何爲您的子域服務,可以通過幾種不同的方式完成此操作。

如果您爲每個客戶都有一個vhost文件,則需要爲客戶端提供的自定義域添加一個「ServerAlias」指令。

如果您通過自己的應用服務器編碼入口點(比如說,從PHP讀取「Host」HTTP標頭然後設置客戶名稱),那麼您需要相應地調整該代碼以解釋外部請求域根據您自己的自定義域的數據庫。你甚至可以使用直接的DNS!

東西就行:

if http "host" header does not end in domain.com: 
    cname = get_cname_record(http "host" header value) 
    if cname does not end in domain.com: 
     return error 404 
    else: 
     site = first part of cname 
else: 
    site = first part of http "host" header 

然後你可以使用DNS爲你的「自定義域數據庫」。確保您使用的是DNS緩存,因爲這些查詢將在每個請求中執行。

+0

謝謝,您的psuedocode有助於理解解決方案。關於DNS緩存,在服務器上它不是默認的?我的意思是DNS查詢由操作系統(Ubuntu)緩存。我需要爲此做些額外的事情嗎? – Nasir

+0

這取決於你如何實現「get_cname_record」。如果您使用gethostbyaddr()或派生類(最可能的選項),那麼您的系統通常會提供某種緩存。但是通過循環一系列查找來進行基準測試,這樣就不會陷入陷阱。我已經看到它發生,所以只是一個FYI。 – GomoX