2008-12-09 77 views
5

我期待在使用ASP.NET一個新的SaaS服務,但對我的愛,我似乎無法弄清楚如何基於最喜歡的SaaS子域做帳查詢應用程序(例如37Signals)。例如,如果我提供yourname.mysite.com,那麼我將如何使用ASP.NET(MVC專門)來提取子域,以便我可以加載正確的模板(顯示您公司的名稱等)?可以通過常規路由完成嗎?帳戶基於查找

這似乎是SaaS的一個共同的東西,所以必須有一個簡單的方法來做到這一點在ASP.NET;我知道有些插件可以用於其他框架,比如Ruby on Rails。

+0

如果您正在認真構建SaaS應用程序,並且您的團隊對此類事情有困難,那麼您的招聘流程存在問題。 – MarkR 2008-12-16 07:08:37

回答

3

這個工作對我來說:

//-------------------------------------------------------------------------------------------------------------------------- 
    public string GetSubDomain() 
    { 
     string SubDomain = ""; 

     if (Request.Url.HostNameType == UriHostNameType.Dns) 
      SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2"); 
     if (SubDomain.Length == 0) 
      SubDomain = "www"; 
     return SubDomain; 
    } 

我假設你想處理同一Web應用程序中的多個賬戶,而不是建立在使用IIS的工具單獨的網站。在我們的工作中,我們開始爲每個子域創建一個新的網站,但發現這種方法不能很好地擴展 - 特別是當您發佈更新並且必須修改幾十個網站時!因此,我建議採用這種方法,而不是上面建議的基於服務器的技術,基於幾年的經驗來完成您的建議。

上面的代碼只是確保這是一個完全形成URL(而不是,比方說,不是IP地址),並返回子域。它在我們處於相當高產量的環境中運行良好。

2

您應該能夠從ServerVariables收藏挑這個,但首先你需要配置IIS和DNS才能正常工作。所以你知道37Signals可能使用Apache或其他開源的unix web服務器。在Apache上,這被稱爲VirtualHosting

要做到這一點與IIS,你需要創建一個新的DNS條目(創建一個CNAME yourname.mysite.com到application.mysite.com)爲每個域指向您的應用程序在IIS(application.mysite.com )。

然後你create a host header entry in the IIS application(application.mysite.com)將接受頭部yourname.mysite.com。用戶實際上會打到application.mysite,com,但地址是自定義子域。然後訪問ServerVariables集合以獲取決定如何自定義網站的值。

注:還有,你可以根據需要遵循幾個替代的實現。

  • 在硬件負載均衡器處理主機頭處理(更可能37Signals公司做到這一點,不是依靠在Web服務器上),並創建一個自定義HTTP標頭傳遞給Web應用程序。
  • 爲每個單獨的應用程序創建一個新的Web應用程序和主機頭。對於大量用戶來說,這可能是一個效率低下的實現,但可以爲某些人提供更好的隔離和安全性。
0

我已經做了它的方式是HttpContext.Request.ServerVariables [ 「HTTP_HOST」]。斯普利特( 「」)。

讓我知道你是否需要更多幫助。

1

您需要配置您的DNS以支持通配符子域。它可以通過添加一個A記錄指向你的IP地址,這樣做:

* A 1.2.3.4 

一旦對其做,無論你輸入之前,您的域名將被髮送到你的根域,在那裏你可以通過拆分得到HTTP_HOST服務器變量,如上述用戶buggs所示:

string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".") 

//use the user variable to query the database for specific data 

PS。如果您使用的是共享主機,則可能需要通過它們的唯一IP插件,因爲通配符域必須工作。如果您使用專用主機,您已擁有自己的IP。