Ruby on rails 正确的自定义域的DNS设置,子域和CNAME指向它们
我有一个多租户Rails应用程序,由Heroku在托管。租户/帐户通过子域(和Postgresql模式)分离。然后,我将自己的域作为自定义域添加到Heroku应用程序中。由于Heroku确实建议不要使用记录,因为“正常运行时间影响”(),我首先尝试将一条CNAME记录从我的自定义域放到myapp.herokuapp.com。这对子域也很有效,比如 当我的客户希望自己的域指向他们的帐户时,问题就开始了,因此,最明显的解决方案似乎是在我的客户DNS中创建一个CNAME记录来指向。这不起作用,当访问该地址时,一条错误消息指出“在该主机名上没有配置应用程序”,并且Ruby on rails 正确的自定义域的DNS设置,子域和CNAME指向它们,ruby-on-rails,heroku,dns,hosting,Ruby On Rails,Heroku,Dns,Hosting,我有一个多租户Rails应用程序,由Heroku在托管。租户/帐户通过子域(和Postgresql模式)分离。然后,我将自己的域作为自定义域添加到Heroku应用程序中。由于Heroku确实建议不要使用记录,因为“正常运行时间影响”(),我首先尝试将一条CNAME记录从我的自定义域放到myapp.herokuapp.com。这对子域也很有效,比如 当我的客户希望自己的域指向他们的帐户时,问题就开始了,因此,最明显的解决方案似乎是在我的客户DNS中创建一个CNAME记录来指向。这不起作用,当访问该
主机www.clientdomain.com
给出:
www.clientdomain.com is an alias for clientaccount.mydomain.com
clientaccount.mydomain.com is an alias for myapp.herokuapp.com
myapp.herokuapp.com is an alias for ar.herokuapp.com
在Heroku提供了一些非常混乱的支持之后,他们建议我使用一个记录,而不是指向他们的三个apex IP。所以改变了,但还是不起作用。然后,他们告诉我在Heroku设置中添加我的客户域作为自定义域,我这样做没有取得好的效果
因此,我当前的配置如下:
Heroku的Myapp具有以下自定义域:
*.mydomain.com
www.clientdomain.com
mydomain.com域名解析
*.mydomain.com有三条指向Heroku apex IP的A记录
clientdomain.com DNS
在clientdomain.com的DNS中,clientdomain.com(不带www)被重定向到www.clientdomain.com(不确定他们是如何做到的,但它似乎工作正常。)
对于www.clientdomain.com,有一条CNAME记录指向clientaccount.mydomain.com
现状
www.mydomain.com正确解析
clientaccount.mydomain.com正确解析
www.clientdomain.com转到www.mydomain.com(无子域)
所以问题很明显是在DNS中,子域是否因为我的应用程序显然没有接收到它而消失了?或者我必须修改Rails中的一些代码才能处理这个问题
子域作为路由约束处理,子域类:
class Subdomain
def self.matches?(request)
request.subdomain.present? && Account.find_by_subdomain(request.subdomain)
end
end
欢迎您的任何意见
编辑
我已经完成了所有建议,我是否也必须更改我的应用程序控制器
应用程序\u控制器.rb
def handle_subdomain
if @account = Account.find_by_subdomain(request.subdomain)
PgTools.set_search_path @account.id
@current_account = @account
else
@current_account = nil
PgTools.restore_default_search_path
end
end
您最好先按如下方式设置主域:
*.mydomain.com
作为heroku appname.herokuapp.com的CNAME
并将*.mydomain.com
作为域名添加到您的应用程序中:
$ heroku domains:add *.mydomain.com
$ heroku domains:add www.myclientdomain.com
接下来,您需要为您的用户/客户端设置一种简单的方法,将其自定义域添加到您的多租户应用程序中。这需要两件事,将域名添加到你的应用程序,并让他们设置DNS。以下是最佳方法:
将www.myclientdomain.com
添加到您的应用程序:
$ heroku domains:add *.mydomain.com
$ heroku domains:add www.myclientdomain.com
然后设置DNS指向Heroku。你最好从Heroku的设置中吸取教训,让你的客户使用你自己的域名CNAME。这将有助于避免锁定,并使您能够更好地控制交通的方向。因此:
CNAMEwww.myclientdomain.com
toproxy.mydomain.com
CNAME将跟随proxy.mydomain.com
到heroku appname.herokuapp.com
,然后解析到heroku IP
那你应该准备好了
理想情况下,您将以比手动添加域名更快的速度与具有自定义域的新客户接洽,因此您将希望自动化该步骤。使用heroku api和客户端,您可以在应用程序中以编程方式管理自定义域。您的最佳选择是首先按照以下方式设置主域:
*.mydomain.com
作为heroku appname.herokuapp.com的CNAME
并将*.mydomain.com
作为域名添加到您的应用程序中:
$ heroku domains:add *.mydomain.com
$ heroku domains:add www.myclientdomain.com
接下来,您需要为您的用户/客户端设置一种简单的方法,将其自定义域添加到您的多租户应用程序中。这需要两件事,将域名添加到你的应用程序,并让他们设置DNS。以下是最佳方法:
将www.myclientdomain.com
添加到您的应用程序:
$ heroku domains:add *.mydomain.com
$ heroku domains:add www.myclientdomain.com
然后设置DNS指向Heroku。你最好从Heroku的设置中吸取教训,让你的客户使用你自己的域名CNAME。这将有助于避免锁定,并使您能够更好地控制交通的方向。因此:
CNAMEwww.myclientdomain.com
toproxy.mydomain.com
CNAME将跟随proxy.mydomain.com
到heroku appname.herokuapp.com
,然后解析到heroku IP
那你应该准备好了
理想情况下,您将以比手动添加域名更快的速度与具有自定义域的新客户接洽,因此您将希望自动化该步骤。使用heroku api和客户端,您可以在应用程序中以编程方式管理自定义域。您需要执行以下操作:
def handle_subdomain
if @account = Account.find_by_subdomain(request.subdomain) || Account.find_by_domain(request.domain)
PgTools.set_search_path @account.id
@current_account = @account
else
@current_account = nil
PgTools.restore_default_search_path
end
end
注意
Account.find\u by_domain(request.domain)
-尽管您可能需要request.host
作为完整主机,而不仅仅是域组件。您需要执行以下操作:
def handle_subdomain
if @account = Account.find_by_subdomain(request.subdomain) || Account.find_by_domain(request.domain)
PgTools.set_search_path @account.id
@current_account = @account
else
@current_account = nil
PgTools.restore_default_search_path
end
end
注意
Account.find\u by_domain(request.domain)
-尽管您可能需要request.host
作为完整主机,而不仅仅是域组件。proxy.mydomain.com?是clientaccount.mydomain.com吗?proxy.mydomain.com吗?是clientaccount.mydomain.com吗?