サブドメインとして複数の仮想ホストを使用してApache構成をセットアップしています。新しいドメイン名を購入したばかりですが、このドメイン名へのすべてのリクエストを、サブドメインを含めて新しいドメイン名にリダイレクトしたいと思います。
old.com > new.com
sub.old.com > sub.new.com
httpd.conf
内でこれを行う簡単な方法はありますか?
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]
フラグはリダイレクトアクションを指定します。%1
で、これはRewriteCond
によってキャプチャされた最初の文字列です。この場合、それはドメインサフィックスである必要があります。 new.comの前に接頭辞ドットがないことが重要です。サブドメインコンポーネントがなかった可能性があります。その場合、ドットはありません。ドットは、RewriteCond正規表現の一部としてキャプチャされている必要があります。$1
で、これはRewriteRule
によってキャプチャされた最初の文字列と一致します。これは、ユーザーがサブドメインの下でアクセスしようとしたURIである必要があります。誰かがRewriteRuleの使用を回避するこれに対する解決策を指摘した場合は、彼らに勇気を出してください。可能な場合は、それを解決策として優先する必要があります。 mod_rewrite
は、専用の構成ディレクティブによって提供されるより洗練されたソリューションが不足している場合に使用します。
また、この例ではHTTPS以外のリダイレクトのみが実行され、Webサーバーが代替ポートを使用しているかどうかは考慮されていないことにも注意してください。このような特別なニーズのためにこれをさらに微調整する必要があるかもしれませんが、それは出発点です。