问题
为什么某些 Multi-Tenancy Web应用程序使用子域来指定租户,而另一些则没有? 是否出于技术,隐私或安全原因? 它是否取决于用于开发Web应用程序的语言或框架? 仅仅是样式还是开发人员的选择?
使用子域来指定租户的示例Web应用程序
Basecamp RepositoryHosting Smugmug Unfuddle
不使用子域来指定租户的示例Web应用程序
Github ThinMind Bitbucket 有几种方法可以在HTTP级别确定租户:
域-租户由整个Host
header 确定子域-Host
header 的子域部分基于路径-路径段,通常按前缀host.com/tenantId/...
基于 cookie-cookie值包含租户ID(好的框架对此进行加密!)基于用户-服务器上的用户 session 或一些数据记录
以下是您的问题的答案:
如果您想给用户一个完全隔离的租用印象,那么(子)域多租用是很好的选择。客户可能需要自定义的欢迎和登录页面,单独的用户库等。另一方面,基于路径的 Multi-Tenancy 对那些不固定于单个租户 namespace 的用户来说是好的。它主要由Facebook,GitHub等社交网络使用。(子)域可以为cookie,跨域资源共享(CORS)提供更好的隔离和安全控制。它使跨租户CSRF或XSS变得更加困难。此外,如果您可以控制DNS或负载均衡器,则可以将租户分配给不同的IP(例如地理路由)或各种版本的应用程序(例如Beta租户)。您可以为最重要的租户分配一个单独的应用程序实例或服务器。这样,您将获得一种便宜的工具来控制单点故障和所有鸡蛋都放在一个篮子中的风险。 允许您访问HTTP header (Host
)的任何Web框架都具有子域功能。任何严重的MVC网络框架都应直接或通过插件为您提供子域作为操作参数。 绝对是设计选择。如果您想了解最佳方法,请考虑为租户提供何种隔离级别。如果您决定但会发现方法不正确,则可以借助HTTP 301重定向迁移到另一个级别。