5

我正在考虑将 ASP.NET 用于新的 SaaS 服务,但出于对我的爱,我似乎无法弄清楚如何像大多数 SaaS 应用程序(例如 37Signals)那样基于子域进行帐户查找。

例如,如果我提供 yourname.mysite.com,那么我将如何使用 ASP.NET(特别是 MVC)来提取子域,以便我可以加载正确的模板(显示您公司的名称等)?可以通过常规路由完成吗?

这在 SaaS 中似乎很常见,因此在 ASP.NET 中必须有一种简单的方法来实现;我知道有一些插件可以用于其他框架,如 Ruby on Rails。

4

4 回答 4

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 地址)并返回子域。在相当大容量的环境中,它对我们来说效果很好。

于 2008-12-15T14:22:05.313 回答
2

您应该能够从ServerVariables集合中选择它,但首先您需要配置 IIS 和 DNS 才能正常工作。所以您知道 37Signals 可能使用 Apache 或其他开源的 unix Web 服务器。在 Apache 上,这称为VirtualHosting

要使用 IIS 执行此操作,您需要为在 IIS (application.mysite.com) 中指向您的应用程序的每个域创建一个新的 DNS 条目(创建一个 CNAME yourname.mysite.com 到 application.mysite.com)。

然后,您在 IIS 应用程序 (application.mysite.com) 中创建一个主机头条目,该条目将接受标头 yourname.mysite.com。用户实际上会点击 application.mysite,com 但地址是自定义子域。然后,您访问 ServerVariables 集合以获取值以决定如何自定义站点。

注意:根据要求,您可以遵循几种替代实现。

  • 在硬件负载平衡器上处理主机标头处理(37Signals 更可能这样做,而不是依赖 Web 服务器),并创建自定义 HTTP 标头以传递给 Web 应用程序。
  • 为每个单独的应用程序创建一个新的 Web 应用程序和主机标头。对于大量用户来说,这可能是一种低效的实现,但可以为某些人提供更好的隔离和安全性。
于 2008-12-09T17:22:54.607 回答
1

您需要配置 DNS 以支持通配符子域。可以通过添加指向您的 IP 地址的 A 记录来完成,如下所示:

* 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。

于 2009-01-05T22:36:56.520 回答
0

我的做法是使用 HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")。

如果您需要更多帮助,请告诉我。

于 2008-12-15T14:19:16.443 回答