2011-02-15 114 views
6

我正在LAMP堆棧中創建一個應用程序,我想爲用戶提供使用他們自己的域而不是我的網站的子域的能力。例如。自定義URL /域名(CNAME別名?)

相反的:http://some_user.mysite.com

他們將使用:http://store.some_user.com/

我知道有一些提供這種使用CNAME記錄幾家公司。 (http://help.bigcartel.com/articles/14-using-a-custom-domain)但是我不確定他們是如何實現這個端到端的。

我的問題是:

  1. 什麼叫這個過程? (所以我可以進一步研究,如果需要的話)

  2. 我需要做什麼來提供這個?即。我需要在DNS,apache和php方面做些什麼來實現這個目標?

任何意見,鏈接或代碼片段將不勝感激。

感謝


UPDATE

到目前爲止,我已經能夠設定,但我仍然有CNAME記錄解析到其他域問題通配符DNS條目。 例如。

http://store.weareunified.com/ - > http://weareunified.joshstuart.com.au/

weareunified.com(這是一個測試用戶主機)DNS

weareunified.com. A 111.67.3.227 
store CNAME weareunified.joshstuart.com.au. 

joshstuart.com.au(這是主應用程序主機)DNS

joshstuart.com.au. A 111.67.3.227 
* CNAME joshstuart.com.au. 

回答

7

我有這個使用LAMP的設置,它工作得很好。下面是我做的:

  1. 我的應用程序在其上的目標服務器位於正常的A記錄(子)域。所以在你的情況下,我假設你的應用程序運行在joshstuart.com.au
  2. 客戶需要將自己的DNS條目更改爲store.weareunified.com CNAME到joshstuart.com.au。
  3. Apache服務器有沒有域規範(對我來說)一個虛擬主機,只需一個<VirtualHost *:80>

就是這樣。目前有70多個CNAME域名,主要應用領域爲CNAME,並且根據需要各自爲自己的站點提供服務(無需重定向等)。

5

Actu盟友,你不需要做任何事情。

您的用戶需要讓他們的DNS提供商添加CNAME記錄,該記錄基本上將http://app.some_user.com/映射到http://some_user.app.com

任何尋找http://app.some_user.com/的DNS客戶端都會被告知要尋找http://some_user.app.com,所以這是DNS /客戶端問題,而不是服務器問題。

Amazon向EC2服務器的用戶推薦這種技術。

請注意,CNAME記錄有一個限制,它們不能分配到域的根目錄 - 您的用戶不能將http://some_user.com/,只有http://app.some_user.com/作爲CNAME。

+0

有一點值得注意的是,從你的角度來看@Josh,你會爲`* .app.com使用[通配符DNS條目](http://en.wikipedia.org/wiki/Wildcard_DNS_record) `以避免每次添加客戶時都必須使用自己的DNS記錄。但是對於用戶自己的自定義地址,我使用Rami,這是他們的域名,他們將使用CNAME或A記錄指向您的實際服務器的IP來管理它。 – 2011-02-15 12:34:07

+0

感謝您的幫助。請原諒我的無知,但將一個cname的行爲像一個「轉發器」或一個網址別名。例如。 app.some_user.com/products是否會顯示在地址欄中,或者是否會轉換爲some_user.app.com/products? – User123342234 2011-02-15 20:43:22

+0

它會顯示爲app.some_user.com/products,我猜是你想要的:-) – 2011-02-16 09:25:11

1

我有類似的東西,我用cpanel api2做了。

基本上,用戶將他的域名指向我的dns,並使用api將他的域名停放在我的域名上。

我將每個用戶的域存儲在數據庫中。

在頁面加載時,我提取http_host並將其與我的數據庫進行比較,以查看該域是否存在。然後,我根據用戶設置(我正在提供來自同一腳本的所有頁面)和數據庫條目來加載頁面。

爲了減少數據庫負載,我將該信息保存在標識主機的會話中。然後,我可以在每次後續加載時檢查它,而不是每次都檢查數據庫。

0

另一種可能性是實際上是用戶的DNS主機並處理所有記錄。你可以爲此獲得開源解決方案。 (但是你可能需要在不同的子網上擁有兩臺DNS服務器)。

0

這裏有幾個不同的部分 - 設置DNS條目,然後讓Apache響應請求。

您是否爲客戶正確設置了CNAME?請注意,您無法在weareunited.com上設置CNAME,它必須位於store.weareunited.com或某個不是根域的其他主機名上。

這聽起來像你可能不知道CNAME的工作方式。當用戶請求store.weareunited.com時,它的本地名稱服務器(例如位於最終用戶的ISP中的名稱服務器,對於Comcast而言,它通常是位於Beaverton的Comcast NS,這是假設本地名稱服務器尚未解析主機名並且沒有緩存)將查詢根名稱服務器以確定誰負責該域。然後,本地namserver將查詢域名服務器以獲取記錄。該記錄可以是A記錄,它是一個IP地址或一個CNAME,它指向另一個主機名。

當本地namesever獲取CNAME時,它將再次運行此過程以獲取A記錄。一旦它最終有IP地址的A記錄,它會將IP地址回傳給最終用戶的瀏覽器,網頁瀏覽器將向IP地址發出請求。

最終結果是Web瀏覽器獲取IP地址,然後使用原始主機名作爲主機標頭 - store.weareunited.com向此IP地址發出請求。所以Apache應該設置爲接收主機名store.weareunited.com的請求。

PHP不會在意的主機名是什麼,除非你正在檢查,比如$ _ SERVER環境變量......

你可以讓你的客戶建立一個CNAME到joshstuart.com.au。您當然可以創建其他主機名,比如weareunited.joshstuart.com.au,或者做一個通配符,然後讓您的客戶將CNAME目標設置爲該唯一的主機名,但爲什麼要麻煩?我只想有:

store.weareunited.com. 3600 IN CNAME joshstuart.com.au. 

只要joshstuart.com.au然後轉手出去的IP地址到你的網站服務器,CNAME將工作。正如我上面提到的,Apache會看到store.weareunited.com的一個請求,因此您需要爲該主機名設置一個虛擬主機,或者像Berklee提到的那樣創建一個通用虛擬主機(雖然我不確定apache指令將用於確保請求被映射到域的正確文件...)。