【发布时间】:2021-08-08 10:34:04
【问题描述】:
我正在构建一个类似于 Shopify 的多租户 rails 应用程序。每当客户注册Account 时,他们将在customer.myapp.com 创建一个子域。此子域返回一个包含与其帐户相关的数据的视图(包括 /admin 区域)。
现在,在某些情况下,客户希望使用自己的自定义域,而不是为他们创建的子域。我需要如何调整我的 rails 路由和控制器以返回包含与客户帐户相关的数据的视图,不仅基于子域,而且基于自定义域或子域?
这就是我设置config/routes.rb 来处理子域的方式:
# config/routes.rb
Rails.application.routes.draw do
...
constraints(SubdomainRequired) do
scope module: :accounts do
...
end
end
end
app/constraints/subdomain_required.rb 看起来像这样:
# app/constraints/subdomain_required.rb
class SubdomainRequired
def self.matches?(request)
request.subdomain.present? && request.subdomain != "www"
end
end
最后我的app/controllers/accounts/base_controller.rb 根据请求子域设置当前帐户:
# app/controllers/accounts/base_controller.rb
module Accounts
class BaseController < ApplicationController
before_action :set_current_account
...
def set_current_account
if request.subdomain.present?
@current_account = Account.find_by(subdomain: request.subdomain)
render_404 if !@current_account
end
end
def render_404
render file: "#{Rails.root}/public/404.html", status: 404
end
...
end
end
对于 DNS 设置,我采用了 Shopify 等公司的方法。看起来他们让他们的客户创建了一个指向他们应用程序的主 IP 地址的 A 记录。他们让他们为“www”子域创建一个 CNAME,它指向一个子域 (sites.myapp.com),设置为应用程序子域的 CNAME(在我的情况下由 DigitalOcean 的应用程序平台管理)。
如果 DNS 设置按预期工作,我想知道当客户登陆我的应用程序时如何将请求指向正确的方向。因此,例如,如果流量达到customer.com 并且它有一条指向我的服务器主 IP 的 A 记录,加上一个用于 sites.myapp.com 的 CNAME,我如何处理请求并将其重定向到正确的子域,同时让用户保持自定义域?
这些是我目前检查过的资源:
- Laravel application with subdomains that can be linked to other domains via CNAME
- multi tenant with custom domain on rails
- Multi-tenant dynamic multiple domains with SSL pointing to single Host/CDN
- https://answers.netlify.com/t/subdomain-and-custom-domain-based-multi-tenant-application/30482/2
- https://www.indiehackers.com/post/how-do-i-setup-a-domain-to-subdomain-architecture-like-shopify-70413820da
- https://help.shopify.com/en/manual/online-store/domains/add-a-domain/using-existing-domains/connecting-domains#set-up-your-existing-domain-to-connect-to-shopify
感谢您的帮助!
【问题讨论】:
-
欢迎来到 StackOverflow。不幸的是,我无法帮助您,但我认为您的问题问得很好并且格式正确(大多数新成员并非如此)。继续!
-
感谢@Hecke29 欢迎我。我很高兴我的问题问得很好并且格式正确。事实上,在此期间,我自己解决了大部分问题,我会在测试完我的解决方案后立即对其进行更新。
标签: ruby-on-rails subdomain multi-tenant