57

DNS A レコードでは、アプリケーションの DNS 構成に IP アドレスをハードコーディングする必要があります

... Heroku は避けることを推奨しています。Heroku は 2 つの回避策を提案しています。

...頂点で CNAME のような機能をサポートする DNS プロバイダーを使用し、サブドメインのリダイレクトを使用します。

私の質問は後者のオプションを中心に展開しています(前者はDreamHost AFAIKでサポートされていないため):

ブラウザーがスローすることなく、HTTPS 要求のルート (つまり、apex または 'naked') ドメインから 'www' サブドメインにリダイレクトすることは可能ですか?

Heroku は次のように考えていません。

...SSL 暗号化を必要とするアプリケーションは、ルート ドメインで ALIAS/ANAME 構成を使用する必要があります。ルート ドメインが SSL (つまり、https://example.com ) 経由で要求された場合、サブドメイン リダイレクトによりブラウザー エラーが発生します。

...しかし、それが不完全な (または不正確な) ステートメントであることを願っています。

明確化の更新:

apex から「www」へのリダイレクトに関する実際の問題はhttps://example.com、ブラウザに直接入力すると証明書の警告が表示されることです。もちろん、これは特殊なケースですが、小さなケースではありません。

ソリューションの更新:

この問題はDNSimpleで解決しました。(ドメインを移管する必要さえありませんでした!)

easyDNS も同様の機能を提供していると思いますが、他のほとんどのドメイン ホスティング会社が提供していないことに驚きました。

4

3 に答える 3

111

ここで考慮すべき、独立しているが相互に依存する 2 つのレベルの間接化があります。1 つ目は、DNS 名が最終的に解決される IP アドレスです。2 つ目は、その IP アドレスのサーバーが行うことです。

ブラウザに URL を入力すると、最初に DNS ルックアップが行われることに注意してください。通常、これはブラウザ自体ではなく、オペレーティング システムによって処理されます。

そのため、ブラウザは OS に「example.comのアドレスは?」と尋ねます。OS はレコードを検索し、 を取得した場合は、レコードが見つかるまでそのCNAMEレコードを検索します。次に、OS がブラウザに応答します。A

ブラウザは、その IP アドレスへの TCP 接続を開きます。

  • http:// URL の場合、ポート 80 に接続し、HTTP リクエストを発行します。
  • http s :// URL の場合、ポート 443 に接続し、TLS/SSL 接続を確立して(証明書の検証を意味します)、セキュア チャネルを介して HTTP 要求を発行します

この時点でのみ、HTTP リダイレクトが発生します。ブラウザはリクエスト ( を送信しGET /、サーバーは 301 で他の URL に応答できます。

レジストラが提供する「サブドメイン リダイレクト」サービスは、301 を発行する通常の HTTP サーバーにすぎないことを理解してください。レジストラのリダイレクト オプションを選択すると、レジストラはAドメインの頂点のレコードを制御するサーバーに設定するだけで、そのサーバーはブラウザーにwww.example.comにアクセスするように指示します。

ほとんどのレジストラは SSL 証明書をリダイレクト サーバーにアップロードすることを許可していないため、ブラウザーはサーバーへの必要な安全な接続を確立できず、HTTP 要求を発行することはありません。したがって、https ://example.comへのリクエストは失敗します。

では、なぜCNAME頂点だけにできないのでしょうか。 禁止されています。

CNAMEドメインシステムは、正規名 ( ) RR [Record Resource]を使用してそのような機能を提供します。CNAMERR はその所有者名をエイリアスとして識別し、RR のセクションで対応する正規名を指定しますRDATARR がノードに存在する場合CNAME、他のデータは存在しないはずです。これにより、正規名とそのエイリアスのデータが異なることはありません。CNAMEこのルールは、他の RR タイプについて権限のあるサーバーに確認することなく、キャッシュされたものを使用できることも保証します。

仕様では、CNAMEレコードが特定の (サブ) ドメインの唯一のレコードである必要があります。SOAこれは、頂点に記録を残すという要件と矛盾します。CNAME(仕様を変更して共存を許可する取り組みがいくつか行われていますが、ドメイン上のSOAによって混乱する壊れた SMTP 実装がまだ多くありCNAMEます。)

apex で SSL を機能させるには、次のオプションがあります。

  • リダイレクト サーバーで SSL をサポートするサードパーティ サービスを使用します。あなたはおそらくこれを支払うでしょう。 ここで1つのサービスです。 このルートはお勧めしません。信頼性を制御できず、SSL 証明書のキーを信頼できる人にも信頼できない人にも渡さなければならないからです。
  • 独自のリダイレクト サーバーを実行します。頂点にはAレコードが必要なため、Heroku や AWS の ELB などのサービスでは提供されない静的 IP が必要になります。そのため、クラウド環境にいる場合、信頼性を保証することは (不可能ではないにしても) 非常に困難になります。プラス面としては、SSL キーを引き続き管理できます。
  • エイリアスを設定できる DNS ホストを使用してください。エイリアスを Heroku ドメイン/ELB などに向けます。これはおそらく最良のオプションです。

エイリアスは技術的には DNS レコードの一種ではありません。A代わりに、別のルックアップの結果からレコードを返すのは、DNS ホスト側の特別な構成です。言い換えると:

  1. OS がexample.comの DNS 要求をDNS ホストに発行します。
  2. DNS ホストは内部エイリアス構成を読み取り、そのドメインの DNS 要求を発行します。したがって、 example.herokuapp.comにエイリアスが設定されている場合A、そのドメインのレコードが検索されます。
  3. DNS ホストはA、エイリアス ルックアップから取得した IP を含む単純なレコードを返します。

エイリアス レコードを使用すると、 wwwドメインが接続されているのと同じクラウド ロード バランサーを頂点に向けることができますCNAMEwwwドメインにSSL をセットアップしたと仮定すると、ネイキッド ドメインは問題なく動作します。この時点で、アプリがリダイレクトを発行するか、ネイキッド ドメインを介してコンテンツを直接提供するかを選択できます。

于 2013-05-14T01:27:12.827 に答える