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