web-dev-qa-db-ja.com

Apache2の複数のホスト名を1つにリダイレクト

たとえば、次のいずれかを入力した場合、複数のホスト名を1つだけにリダイレクトしようとしています。

foo.example.com
www.example.com
bar.example.com
eample.com

www.example.comにリダイレクトする必要があります

www.example.comをServerNameとして、その他をServerAliasとして仮想ホストをインストールし、mod_rewriteを使用してホスト名が正しいかどうかを確認し、そうでない場合はリダイレクトを行います。

問題は、すべてがServerNameディレクティブのホスト名で提供されているように見えるため、mod_rewriteが常にwww.example.comを取得することです。これは、Apache2のドキュメントと一致しています。

たとえば、ドメインwww.domain.tldを提供していて、同じIPアドレスを指す仮想ホストwww.otherdomain.tldを追加するとします。次に、単純に以下をhttpd.confに追加します。

NameVirtualHost *:80

<VirtualHost *:80>
サーバー名www.domain.tld
ServerAlias domain.tld * .domain.tld
DocumentRoot/www/domain

<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot/www/otherdomain

または、NameVirtualHostとディレクティブの両方で*の代わりに明示的なIPアドレスを指定できます。たとえば、あるIPアドレスで名前ベースの仮想ホストを実行し、IPベースまたは別のアドレスで名前ベースの仮想ホストの別のセットを実行するために、これを行うことができます。

多くのサーバーは、複数の名前でアクセスできることを望んでいます。これは、セクション内に配置されたServerAliasディレクティブで可能です。たとえば、上記の最初のブロックのServerAliasディレクティブは、リストされた名前が、同じWebサイトを表示するために使用できる他の名前であることを示しています。

ServerAlias domain.tld * .domain.tld then domain.tldドメイン内のすべてのホストに対する要求は、www.domain.tld仮想ホストによって処理されます

この機能を回避し、一致するServerAliasのホスト名を使用してリクエストサーバーを取得するためのApache2ディレクティブはありますか?

または、リダイレクトのためだけに別の仮想ホストを作成する必要がありますか?

ありがとう

6
alcuadrado

あなたに正直に言うと、これについて私が見ることができる最良の方法は、メインドメインを通常次のように設定した場合です:

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /www/domain 
</virtualhost>

次に、リダイレクトするすべてのドメインを保持する新しい仮想ホストを次のように作成します。

<VirtualHost *:80>
    ServerName example.com
    ServerAlias foo.example.com bar.example.com others.example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

そのフォルダー内に、301を呼び出す単純なindex.phpページを作成して、そこに保持されているすべてのドメインが301コードを使用してメインドメインにリダイレクトされるようにします。

<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.example.com" );
?> 

なぜあなたはそれがこのように優れていると思いますか?

この方法では、保持してメインドメインに再接続する新しいドメインを取得するたびに一連の場所を更新し続ける必要がなくなり、現在の名前でユーザーにサービスを提供することはありませんが、実際にはメインドメインにリダイレクトされます問題です。

あなたがサーバー所有者であるならば、あなたはそれをさらに良くすることができます、あなたはvhost.confファイルのhttpd.confの最初の仮想ホストとして2番目の仮想ホストを置くことができます、そしてあなたがサーバーのIPをヒットする時はいつでもそれはあなたをリダイレクトページに導きますこの場合、ユーザーをメインドメインに誘導します。一連のServerAliasを設定する代わりに、IPにつながる特定のサブドメインまたはドメインのDNS Aレコードを作成するだけで、サーバーが残りを処理します。

この最後のケースでは、仮想ホストに必要なのは次のとおりです。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /www/redirect_folder 
</virtualhost>

サーバーIPにヒットするすべてのリクエストは最初の仮想ホストに送信されるため、ServerAliasは必要ありません。

さらに、.htaccessを使用してこれを実行したい場合は、次のようになります:

RewriteEngine on
rewritecond %{http_Host} ^foo.example.com [nc]
rewriterule ^(.*)$ http://www.example.com/$1 [r=301,nc] 
9
Prix

この場合、すべて構成順序に依存します。

このような設定がある場合:

<VirtualHost>ServerAlias *.domain.tld</VirtualHost>
<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>

人々は常に最初の仮想ホストで終わるでしょう。ただし、次のように定義すると、機能します。

<VirtualHost>ServerName subdomain.domain.tld</VirtualHost>
<VirtualHost>ServerAlias *.domain.tld</VirtualHost>

ワイルドカードは常に一番下に置く必要があることに注意してください。

1
Wolph