问题
- 为什么某些 Multi-Tenancy Web 应用程序使用子域来指定租户,而其他应用程序则不然?
- 有技术、隐私或安全方面的原因吗?
- 它是否取决于用于开发 Web 应用程序的语言或框架?
- 这只是风格或开发人员选择的问题吗?
使用子域指定租户的示例 Web 应用程序
不使用子域来指定租户的示例 Web 应用程序
最佳答案
有多种方法可以确定 HTTP 级别的租户:
- 域 - 租户由整个
Host
header 确定 - 子域 -
Host
header 的子域部分, - 基于路径 - 路径段,通常由前缀
host.com/tenantId/...
- 基于 cookie - cookie 值包含租户 ID(良好的框架对此进行加密!)
- 基于用户 - 用户 session 或服务器上的某些数据记录
以下是您问题的答案:
如果您想让用户感受到完全隔离的租户,那么(子)域 Multi-Tenancy 是很好的选择。客户可能需要自定义欢迎和登录页面、单独的用户群等。另一方面,基于路径的 Multi-Tenancy 对于不固定于单租户命名空间的用户来说是有好处的。它主要由 Facebook、GitHub 等社交网络使用。
(子)域可以为您提供更好的 Cookie 隔离和安全控制、跨域资源共享 (CORS)。它使跨租户 CSRF 或 XSS 变得更加困难。此外,如果您可以控制 DNS 或负载均衡器,您可以将租户分配给不同的 IP(例如地理路由)或不同版本的应用程序(例如 beta 租户)。您可以为最重要的租户分配单独的应用程序实例或服务器。这样您就可以获得一种廉价的工具来控制单点故障的风险,并将所有鸡蛋放在一个篮子里。
任何允许您访问 HTTP header (
Host
) 的 Web 框架都支持子域。任何严肃的 MVC Web 框架都应该直接或通过插件为您提供子域作为操作参数。这绝对是一个设计选择。如果您想知道最好的方法,请考虑您希望为租户提供何种程度的隔离。如果您决定但发现方式不正确,那么您可以借助 HTTP 301 重定向迁移到另一个级别。
关于subdomain - 为什么在 Multi-Tenancy Web 应用程序中使用子域来指定租户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4987201/