アプリのカスタムドメイン名
最終更新日 2024年04月30日(火)
Table of Contents
デフォルトでは、Heroku アプリは、アプリの Heroku ドメイン (APPNAME-IDENTIFIER.herokuapp.com
という形式) で利用できます。たとえば、example-app
という名前のアプリは、example-app-1234567890ab.herokuapp.com
でホストされています。アプリはサブドメインで利用できますが、本番環境のアプリにはカスタムドメインを追加することを強くお勧めします。
Heroku ではサブドメインへの識別子の追加を 2023 年 6 月 14 日に開始しました。この日より前に作成されたアプリケーションは、サブドメインがアプリ名と同じである古いサブドメインスキームに従います。
Heroku DNS は、DNSSEC を使用して、すべての herokuapp.com
および herokudns.com
ドメインへのリクエストを認証します。DNSSEC は、DNS サーバーで受信する情報が信頼できるものであることを確認できるようにするセキュリティシステムです。
Heroku 以外のドメイン (たとえば、www.yourcustomdomain.com
など) でアプリを利用できるようにするには、アプリにカスタムドメインを追加します。
すべての Heroku アプリにカスタムドメインを追加できます。ドメインを追加しても、追加料金は発生しません。セキュリティ上の理由から、アプリにドメインを追加するには、Heroku アカウントを確認する必要があります。
Heroku では、ドメイン登録サービス (カスタムドメイン名の登録を行う) や DNS プロバイダーサービス (カスタムドメイン名をアプリに対応付ける DNS サーバーをホストする) は提供していません。
手順の概要
以降、この記事では、次の手順について詳細に説明します。
- カスタムドメイン名を所有していることを確認します。カスタムドメイン名は、ドメイン登録サービスで購入できます。
heroku domains:add
コマンドでカスタムドメインをアプリに追加します。heroku domains
コマンドを使用して、Heroku から提供される DNS ターゲットを調べます。- アプリの DNS プロバイダーを設定して、Heroku から提供される DNS ターゲットに対応付けます。
- カスタムドメインでアプリにアクセスできることを確認します。DNS の変更が伝播するまで、時間がかかる場合があります。
サブドメインを使用してカスタムドメインを追加する
サブドメインを使用してカスタムドメインを追加するには、domains:add
Heroku CLI コマンドを使用します。
$ heroku domains:add www.example.com -a example-app
Adding www.example.com to ⬢ example-app... done
▸ Configure your app's DNS provider to point to the DNS Target
▸ whispering-willow-5678.herokudns.com.
▸ For help, see https://devcenter.heroku.com/articles/custom-domains
The domain www.example.com has been enqueued for addition
▸ Run heroku domains:wait 'www.example.com' to wait for completion
アクセント文字などの非 ASCII 文字が含まれるドメイン名は、Punycode を使用して追加する必要があります。たとえば、éste.com
というドメインは、先に xn--ste-9la.com
に変換する必要があります。
example.com is currently in use by another app
というエラーメッセージが表示される場合は、「ドメインの追加に関するルール」セクションを参照してください。
DNS にサブドメインを設定する
heroku domains:add
コマンドでドメインを追加したら、DNS プロバイダーに、Heroku から提供される DNS ターゲットを対応付ける必要があります。この DNS ターゲットは、heroku domains
コマンドで表示できます (詳細は、「既存のドメインを表示する」を参照)。
通常は、DNS プロバイダーで新しい CNAME
レコードを設定して、DNS プロバイダー に Heroku を対応付けます。次の表に、一般的な CNAME
レコードのパターンを示します。
レコード | 名前 | ターゲット |
---|---|---|
CNAME |
www |
whispering-willow-5678.herokudns.com. |
CNAME |
othersubdomain |
autumn-sunset-1495.herokudns.com. |
CNAME |
examplesecure |
example-12345.ssl.herokudns.com. |
ターゲットドメインの末尾に .
が必要かどうかは、ご使用の DNS プロバイダーによって異なります。
CNAME
レコードの作成に関する具体的な手順については、ご使用の DNS プロバイダーのドキュメントを参照してください。
DNS の変更が伝播しているという前提で、DNS が正しく設定されているかどうかを host
コマンドで確認できます。
$ host www.example.com
www.example.com is an alias for whispering-willow-5678.herokudns.com.
...
DNS の変更は、有効になるまでに数分~数日かかる可能性があります。事前に DNS の TTL を短くしておくと、この伝播時間を最小限に抑えることができます (なくすことはできません)。
カスタムドメインを設定しても、アプリの Heroku ドメインは常にアクティブなまま維持されます。ユーザーがカスタムドメインのみ使用するようにする場合は、アプリから HTTP ステータスコード 301 Moved Permanently を送信して、Web ブラウザにカスタムドメインの使用を指示する必要があります。HTTP リクエストの Host
ヘッダーフィールドに、ユーザーがアクセスしようとしているドメインが表示されます。そのフィールドが example.herokuapp.com
の場合は、リダイレクトが送信されます。
DNS レコードと Heroku リソースの同期を保つよう注意してください。Heroku アプリを削除したが、対応する DNS レコードの削除も更新も行わない場合、サブドメインの乗っ取り攻撃に対して脆弱になります。
カスタムルートドメインを追加する
サブドメインに加え、ルートドメインを追加する必要があります。ルートドメインの追加手順は、同じように Heroku CLI で行います。
$ heroku domains:add example.com -a example-app
Adding example.com to ⬢ example-app... done
▸ Configure your app's DNS provider to point to the DNS Target
▸ whispering-willow-5678.herokudns.com.
▸ For help, see https://devcenter.heroku.com/articles/custom-domains
The domain example.com has been enqueued for addition
▸ Run heroku domains:wait 'example.com' to wait for completion
DNS にルートドメインを設定する
DNS プロバイダーへのルートドメインの設定は、DNS プロバイダーへのサブドメインの設定と同様です。ただし、サブドメインの場合は設定するレコードのタイプが常に CNAME であるのに対し、ルートドメインの場合、レコードのタイプは DNS プロバイダーによって異なります。
- DNSimple では ALIAS
- DNS Made Easy では ANAME
- easyDNS では ANAME
- PointDNS では ALIAS
- CloudFlare では CNAME。また、「Configure Cloudflare and Heroku over HTTPS」 (HTTPS 経由で Cloudflare と Heroku を構成する) ドキュメントも参照してください。
- Namecheap の ALIAS
- DreamHost では ALIAS
一部の DNS プロバイダーでは、ルートドメインには A レコード しか使用できません。A レコードには静的 IP が必要なため、残念ながら、A レコードでは Heroku にルートドメインを対応付けることができません。A レコードには、オンプレミスのデータセンター、クラウドインフラストラクチャサービス、Heroku のようなプラットフォームなどの環境で使用する場合に、重大な可用性の問題があります。Heroku では動的 IP アドレスを使用しているため、ルートドメインを別のドメインに対応付けられるように、CNAME のようなレコード (ALIAS レコードや ANAME レコードとも呼ばれる) を使用する必要があります。下記の例を参照してください。
どのプロバイダーを使用している場合でも、CNAME レコードと同じように、ルートドメインの ALIAS/ANAME/CNAME エントリを DNS ターゲットに対応付けます。
DNS プロバイダーによっては、「名前」の値が空または @
の場合は、ルートドメインを示します。
レコード | 名前 | ターゲット |
---|---|---|
ALIAS または ANAME |
<empty> または @ |
hidden-sierra-7936.herokudns.com. |
ワイルドカードドメインを追加する
ワイルドカードドメインを使用すると、1 件のレコードで、あらゆるサブドメインをアプリにマッピングすることができます。ワイルドカードドメインは、一般的に、ユーザーやアカウントごとにパーソナライズされたサブドメインを使用するアプリケーションで使用します。すでに同じトップレベルドメイン (TLD) を使用している既存アプリをすべて所有している場合は、ワイルドカードドメインを追加できます。たとえば、あるアプリがすでに www.example.com
を使用している場合、*.example.com
を追加するには、そのアプリを所有している必要があります。
ワイルドカードドメインは、*
というワイルドカードサブドメインの表記を使用する点以外は、ほかのドメインの場合と同じようにアプリに追加します。
$ heroku domains:add *.example.com -a example-app
Adding *.example.com to ⬢ example-app... done
▸ Configure your app's DNS provider to point to the DNS Target
▸ encircled-magnolia-9265.herokudns.com.
▸ For help, see https://devcenter.heroku.com/articles/custom-domains
The domain *.example.com has been enqueued for addition
▸ Run heroku domains:wait '*.example.com' to wait for completion
アプリのいずれかにワイルドカードドメインが使用されていても、同じトップレベルドメイン (TLD) の特定のサブドメインをほかのアプリに追加できます。リクエストのルーティング時に、特定のサブドメインは、ワイルドカードドメインの前に評価されます。
ワイルドカードドメインを使用する場合は、ご使用の DNS プロバイダーの設定で Heroku に同意していることを確認することが重要です。特に、example.herokuapp.com
に対応付けるために *.example.com
を DNS に設定した場合は、必ず heroku domains:add *.example.com
も実行してください。このコマンドを実行しないと、悪意のある人が自分の Heroku アプリに baddomain.example.com
を追加して、あなたのアプリケーション宛てのトラフィックを受信してしまう可能性があります。
DNS にワイルドカードドメインを設定する
DNS プロバイダーで encircled-magnolia-9265.herokudns.com.
に CNAME レコードを追加するには、*
というワイルドカードサブドメイン表記を使用します。
レコード | 名前 | ターゲット |
---|---|---|
CNAME |
* |
encircled-magnolia-9265.herokudns.com.
|
カスタムドメインを削除する
domains:remove
でドメインを削除します。
$ heroku domains:remove www.example.com -a example-app
Removing www.example.com from ⬢ example-app... done
アプリを破棄すると、そのアプリに割り当てられているカスタムドメインは解放されます。その後、解放されたカスタムドメインをほかのアプリに割り当てることができます。
既存のドメインを表示する
アプリの現在の Heroku ドメイン、カスタムドメイン、DNS ターゲットを表示するには、heroku domains
コマンドを使用します。
$ heroku domains -a example-app
=== example Heroku Domain
example.herokuapp.com
=== example Custom Domains
Domain Name DNS Target
--------------- --------------------------
example.com hidden-sierra-7936.herokudns.com
www.example.com whispering-willow-5678.herokudns.com
Common Runtime
古いアプリケーションでは、DNS ターゲットの形式が [name of app].herokuapp.com
の場合があります。SSL を使用していない場合は、Dashboard や CLI の出力に表示される DNS ターゲットに関係なく、[name of app].herokuapp.com
と <haiku>.herokudns.com
のどちらの形式でも DNS ターゲットとして機能します。
独自の証明書をアップロードしたり、Automated Certificate Management を使用したりするときには <haiku>.herokudns.com
の形式を使用する必要があるため、<haiku>.herokudns.com
を使用することをお勧めします。
Private Space
Private Space アプリの DNS ターゲットの形式は、<haiku>.<haiku>.herokuspace.com
です。
ドメインの追加に関するルール
すべての Heroku ユーザーが自分のアプリにドメインを追加できます。Heroku では、明示的にドメインの所有権を確認する代わりに、ドメインの権利が複数のユーザーまたはアプリによって主張されないように、次のルールを施行しています。
- 1 つのアプリには、最大 1,000 件のカスタムドメインを割り当てることができます。
- 特定のドメインは、1 つの Heroku アプリにのみ追加できます。たとえば、
www.example.com
をアプリexample-1
に追加した場合、そのドメインをアプリexample-2
にも追加することはできません。 - 対応するサブドメインをすでに使用している既存アプリを
すべて所有している場合は、ワイルドカードドメインを追加できます。たとえば、あるアプリがすでに
www.example.com
を使用している場合、*.example.com
を追加するには、そのアプリを所有している必要があります。 - 該当するワイルドカードドメインが割り当てられたアプリを所有している場合は、サブドメインまたは Apex ドメインを追加できます。たとえば、
www.example.com
またはexample.com
を追加するには、*.example.com
を使用するアプリを所有している必要があります (そのようなカスタムドメインが存在する場合)。 - 当該ドメインのワイルドカード SSL 証明書を使用しているすべてのアプリケーションが同じアカウントに所有されている場合は、サブドメインを追加できます。たとえば、
*.example.com
のワイルドカード SSL 証明書がアップロードされているアプリが別のアカウントにある場合は、something.example.com
を自分のアカウントのアプリに追加できません。 wildcard
は、Heroku のサブドメインのための予約キーワードです。たとえば、wildcard.example.com
を使用するとエラーになります。
自分が所有しているドメインを追加できない場合は、サポートチケットを登録してください。
ドメイン名用語集
- ドメイン または ドメイン名: アプリにアクセスするための完全な名前 (つまり、IP アドレスを使用せずにアクセス)。たとえば、
www.yourcustomdomain.com
- サブドメイン:
www.yourcustomdomain.com
のwww
- ルートドメイン (ネイキッドドメイン、ベアドメイン、ゾーン Apex ドメインともいう): 「www.yourcustomdomain.com」の「yourcustomdomain.com」
- ワイルドカードドメイン: すべてのサブドメインに一致するドメインで、
*.yourcustomdomain.com
のように表記される - ドメイン登録サービス: カスタムドメイン名の購入や登録ができる企業
- DNS プロバイダー: カスタムドメイン名を送信先 (「DNS ターゲット」) に変換する DNS サーバーを管理している企業。フィールドは、CNAME、ALIAS、ANAME、Aレコードとも呼ばれます。最初の 3 つのみ、Heroku アプリで動作します (A レコードには IP アドレスが必要で、Heroku アプリには固定の受信 IP アドレスがないため)。
- Heroku ドメイン: 各アプリに付与されるデフォルトドメインを示す Heroku 用語。
APPNAME-IDENTIFIER.herokuapp.com
という形式を使用します。 - DNS ターゲット: カスタムドメイン名の送信先を DNS プロバイダーに指定するための Heroku ドメインを示す Heroku 用語。