Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正确的自定义域的DNS设置,子域和CNAME指向它们_Ruby On Rails_Heroku_Dns_Hosting - Fatal编程技术网

Ruby on rails 正确的自定义域的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记录来指向。这不起作用,当访问该

我有一个多租户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。这将有助于避免锁定,并使您能够更好地控制交通的方向。因此:

CNAME
www.myclientdomain.com
to
proxy.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。这将有助于避免锁定,并使您能够更好地控制交通的方向。因此:

CNAME
www.myclientdomain.com
to
proxy.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吗?