1

http://myapp.herokuapp.comでHerokuでホストされているマルチテナントRailsアプリがあります。テナント/アカウントはサブドメイン(およびPostgresqlスキーマ)を介して分離されています。次に、自分のドメインをカスタムドメインとしてHerokuアプリに追加しました。Herokuは、「稼働時間の影響」のためにAレコードの使用を本当に推奨していないため(https://devcenter.heroku.com/articles/avoiding-naked-domains-dns-arecords)、最初にカスタムドメインからCNAMEレコードをmyapp.herokuapp.com。これは、http: //clientaccount.mydomain.comなどのサブドメインでも問題なく機能しました。

問題は、クライアントが自分のアカウントを指す自分のドメインを望んでいたときに始まり、http : //www.clientdomain.comにhttp://clientaccount.mydomain.comが表示されました。最も明白な解決策は、自分のアカウントにCNAMEレコードを作成することでした。http://clientaccount.mydomain.comを指すクライアントDNS 。それは機能しませんでした。アドレスにアクセスすると、「そのホスト名に構成されたアプリはありません」というエラーメッセージが表示され、次のメッセージも表示されhost 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からの非常に混乱したサポートの後、3つの頂点IPを指す代わりにAレコードを使用するようにアドバイスされました。それでそれを変更しましたが、それでも機能しませんでした。次に、クライアントドメインをHeroku設定のカスタムドメインとして追加するように言われましたが、これは良い結果が得られませんでした。

したがって、現在の構成は次のとおりです。

HerokuのMyappには、次のカスタムドメインがあります。

* .mydomain.com www.clientdomain.com

mydomain.com DNS

* .mydomain.comには、HerokuapexIPを指す3つのAレコードがあります

clientdomain.com DNS

clientdomain.comのDNSでは、clientdomain.com(wwwなし)はwww.clientdomain.comにリダイレクトされます(どのように実行されるかはわかりませんが、機能しているようです)。

www.clientdomain.comの場合、clientaccount.mydomain.comを指すCNAMEレコードがあります

現在の状態

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

どんな入力でも大歓迎です!

編集

提案されたすべてのことを実行しましたが、アプリケーションコントローラーも変更する必要がありますか?

application_controller.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
4

2 に答える 2

6

ここでの最善の策は、最初にメインドメインを次のように設定することです。

*.mydomain.comCNAMEとしてheroku-appname.herokuapp.com

そして、ドメイン名としてアプリに追加*.mydomain.comします。

$ heroku domains:add *.mydomain.com

次に、ユーザー/クライアントがカスタムドメインをマルチテナントアプリに追加するための簡単な方法を設定する必要があります。これには、アプリにドメイン名を追加することと、DNSを設定することの2つが必要です。最善のアプローチは次のとおりです。

www.myclientdomain.comアプリに追加:

$ heroku domains:add www.myclientdomain.com

次に、Herokuを指すようにDNSを設定します。Herokuのセットアップからレッスンを受けて、クライアントに自分が所有するドメイン名のCNAMEを付けるのが最善です。これにより、ロックインを回避し、トラフィックを転送する場所をより細かく制御できます。それで:

CNAMEwww.myclientdomain.comからproxy.mydomain.com

CNAMEは、Heroku IPに従い、解決しますproxy.mydomain.comheroku-appname.herokuapp.com

その後、すべての設定が完了しているはずです。

理想的には、ドメイン名を手動で追加するよりも早くカスタムドメインを使用して新規顧客を獲得するため、そのステップを自動化する必要があります。heroku apiとクライアントを使用すると、アプリ内でカスタムドメインをプログラムで管理できます。

于 2012-05-05T02:52:31.217 に答える
2

次のようなことをする必要があります。

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_by_domain(request.domain)が必要になる場合があります。request.host

于 2012-05-09T08:23:12.693 に答える