web-dev-qa-db-ja.com

Apacheリダイレクトドメインとすべてのサブドメイン

サブドメインとして複数の仮想ホストを使用してApache構成をセットアップしています。新しいドメイン名を購入したばかりですが、このドメイン名へのすべてのリクエストを、サブドメインを含めて新しいドメイン名にリダイレクトしたいと思います。

old.com > new.com
sub.old.com > sub.new.com

httpd.conf内でこれを行う簡単な方法はありますか?

4

RewriteRuleを作成してからしばらく経ちましたが、ここに私の亀裂があります。

RewriteEngine on

RewriteCond %{HTTP_Host} (.+\.)?old\.com$ [NC]
RewriteRule (.*) http://%1new.com$1 [R]

これをold.comの名前ベースの仮想ホストに配置します。これが思考プロセスです。私が少し錆びている場合は、自分で修正することができます。

RewriteCond内訳:

  • RewriteCondは、「1つ以上の文字の後にリテラルドットが続く」というプレフィックスの後にold.comが続くすべての着信ホストに一致します。ドットは、サブドメインコンポーネントが指定されていない限り存在しないため、括弧内にあります。
  • バックスラッシュは、ドットの意味をエスケープするためのものです。 (リテラルにする)
  • ?は、括弧内に含まれるすべてのものがオプションであることを指定します。 (サブドメインコンポーネント)
  • $文字は、正規表現を文字列の末尾に固定して、時期尚早のマッチングの奇妙さを防ぎます。
  • [NC]フラグは、これを大文字と小文字を区別しないように強制します。
  • 仮想ホストはすべての文字列に一致するパターンが含まれていることを確認するため、この一致自体は何もしません。重要なことは、括弧が次のRewriteRuleの着信ホストヘッダーのサブドメインコンポーネントをキャプチャすることです。

RewriteRule内訳:

  • (.*)を使用して着信要求のURI全体をキャプチャします。
  • 先にスキップして、[R]フラグはリダイレクトアクションを指定します。
  • リダイレクトURLには2つの置換があります。
    • 1つ目は%1で、これはRewriteCondによってキャプチャされた最初の文字列です。この場合、それはドメインサフィックスである必要があります。 new.comの前に接頭辞ドットがないことが重要です。サブドメインコンポーネントがなかった可能性があります。その場合、ドットはありません。ドットは、RewriteCond正規表現の一部としてキャプチャされている必要があります。
    • 2番目は$1で、これはRewriteRuleによってキャプチャされた最初の文字列と一致します。これは、ユーザーがサブドメインの下でアクセスしようとしたURIである必要があります。

誰かがRewriteRuleの使用を回避するこれに対する解決策を指摘した場合は、彼らに勇気を出してください。可能な場合は、それを解決策として優先する必要があります。 mod_rewriteは、専用の構成ディレクティブによって提供されるより洗練されたソリューションが不足している場合に使用します。

また、この例ではHTTPS以外のリダイレクトのみが実行され、Webサーバーが代替ポートを使用しているかどうかは考慮されていないことにも注意してください。このような特別なニーズのためにこれをさらに微調整する必要があるかもしれませんが、それは出発点です。

5
Andrew B