Apacheを使用して一時的および永続的なリダイレクトを作成する方法
序章
HTTPリダイレクトは、あるドメインまたはアドレスを別のドメインまたはアドレスにポイントする方法です。 リダイレクトにはいくつかの種類があり、それぞれがクライアントブラウザとは異なる意味を持っています。 最も一般的な2つのタイプは、一時的なリダイレクトと永続的なリダイレクトです。
一時的なリダイレクト(応答ステータスコード 302 Found )は、URLを別の場所から一時的に提供する必要がある場合に役立ちます。 たとえば、サイトメンテナンスを実行している場合は、ドメインから説明ページへの一時的なリダイレクトを使用して、まもなく戻ってくることを訪問者に通知することができます。
一方、永続的なリダイレクト(応答ステータスコード 301永続的に移動)は、古いアドレスを完全に忘れて、もうアクセスを試みないようにブラウザに通知します。 これらは、ドメイン名を変更する場合など、コンテンツが恒久的に新しい場所に移動された場合に役立ちます。
サーバー構成ファイルの仮想ホストエントリに次のような行を追加することで、Apacheで一時的なリダイレクトを作成できます。
Redirect /oldlocation http://www.newdomain.com/newlocation
同様に、永続的なリダイレクトには次のような行を使用します。
Redirect permanent /oldlocation http://www.newdomain.com/newlocation
このガイドでは、Apacheで各種類のリダイレクトを実装する方法についてより詳細に説明し、特定のユースケースの例をいくつか紹介します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Apache 2がインストールされ、仮想ホストでWebサイトにサービスを提供するように設定された1台のサーバー。 Ubuntu 16.04 、CentOS 7 の、またはDebian7のでApache仮想ホストを設定する方法に従ってください。
ソリューションの概要
Apacheでは、Redirectディレクティブを使用して、単純な単一ページのリダイレクトを実行できます。このディレクティブは、Apacheの新規インストールでデフォルトで有効になっているmod_aliasモジュールに含まれています。 このディレクティブは、古いURLと新しいURLの少なくとも2つの引数を取り、一時的なリダイレクトと永続的なリダイレクトの両方を作成するために使用できます。
最も単純な形式では、サーバー構成の次の行を使用して一時的なリダイレクトを実行できます。
リダイレクトによる一時的なリダイレクト
<VirtualHost *:80>
ServerName www.domain1.com
Redirect / http://www.domain2.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.com
. . .
</VirtualHost>
このリダイレクトは、www.domain1.comに対するすべての要求をwww.domain2.comに転送するようにブラウザーに指示します。 ただし、このソリューションは、サイト全体ではなく、単一のホームページでのみ機能します。
複数のページをリダイレクトするには、RedirectMatchディレクティブを使用できます。このディレクティブは、正規表現を使用して、単一のファイルだけでなくディレクトリ全体を指定します。 RedirectMatchは、括弧内の正規表現パターンに一致し、$1式を使用してリダイレクト先の一致したテキストを参照します。ここで、1は一致したテキストの最初のグループです。 より複雑な例では、後続の一致するグループに順番に番号が付けられます。
たとえば、www.domain1.com内のすべてのページをwww.domain2.comに一時的にリダイレクトする場合は、次を使用できます。
RedirectMatchを使用した一時的なリダイレクト
<VirtualHost *:80>
ServerName www.domain1.com
RedirectMatch ^/(.*)$ http://www.domain2.com/$1
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.com
. . .
</VirtualHost>
デフォルトでは、RedirectディレクティブとRedirectMatchディレクティブの両方が一時的なリダイレクトを確立します。 永続的なリダイレクトを作成する場合は、次のいずれかのディレクティブにpermanentを追加することで作成できます。
永続的なリダイレクト
Redirect permanent / http://www.domain2.com RedirectMatch permanent ^/(.*)$ http://www.domain2.com/$1
mod_rewriteモジュールを使用して、より柔軟で強力なリダイレクトを作成することもできます。 これはこの記事の範囲外ですが、Apacheのmod_rewriteを設定する方法のmod_rewriteから始めることができます。
いくつかの具体的な例に移りましょう。
例1—別のドメインへの移動
Webプレゼンスを確立していて、ドメインを新しいアドレスに変更したい場合は、古いドメインを単に放棄しないことが最善です。 あなたのサイトへのブックマークとインターネット上の他のページにあるあなたのサイトへのリンクは、あなたのコンテンツが新しい場所を見つける方法についてのブラウザへの指示なしに消えると壊れます。 リダイレクトせずにドメインを変更すると、サイトは以前の訪問者からのトラフィックを失います。
この例では、domain1.comという古いドメインからdomain2.comという新しいドメインへのリダイレクトを構成します。 ここでは、古いドメインが削除され、今後すべてのトラフィックが新しいドメインに移動するため、永続的なリダイレクトを使用します。
次のように、Apacheですでに構成されているdomain1.comという単一のドメインからサービスを提供するようにWebサイトを構成していると仮定します。
/etc/apache2/sites-available/domain1.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName domain1.com
ServerAlias www.domain1.com
DocumentRoot /var/www/domain1.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
また、domain2.comで将来のバージョンのWebサイトをすでに提供していることも前提としています。
/etc/apache2/sites-available/domain2.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName domain2.com
ServerAlias www.domain2.com
DocumentRoot /var/www/domain2.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
domain1.com仮想ホスト構成ファイルを変更して、domain2.comへの永続的なリダイレクトを追加しましょう。
/etc/apache2/sites-available/domain1.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName domain1.com
ServerAlias www.domain1.com
DocumentRoot /var/www/domain1.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RedirectMatch permanent ^/(.*)$ http://domain2.com/$1
</VirtualHost>
RedirectMatchディレクティブを使用して前述のリダイレクトを追加しました。 単純なRedirectの代わりにRedirectMatchを使用して、ホームページだけでなくすべてのWebサイトページが影響を受けるようにします。 ^/(.*)$正規表現は、URLの/以降のすべてに一致します。 たとえば、http://domain1.com/index.htmlはhttp://domain2.com/index.htmlにリダイレクトされます。 永続的なリダイレクトを実現するには、RedirectMatchディレクティブの後にpermanentを追加するだけです。
注: systemctl restart apache2を使用して構成を変更した後は、必ずApacheを再起動してください。
例2—単一ページ名の変更にもかかわらず永続的なエクスペリエンスを作成する
場合によっては、サイトで既に公開され、トラフィックを受信している個々のページの名前を変更する必要があります。 名前だけを変更すると、元のURLにアクセスしようとする訪問者に404 Not Foundエラーが発生しますが、リダイレクトを使用することでこれを回避できます。 これにより、古いページをブックマークしたり、検索エンジンの古いリンクから見つけたユーザーが、引き続き正しいページにアクセスできるようになります。
あなたのウェブサイトに、それぞれproducts.htmlとservices.htmlという製品とサービスの2つの別々のページがあると想像してみてください。 ここで、これら2つのページをoffers.htmlという1つのオファーページに置き換えることにしました。 products.htmlおよびservices.htmlからoffers.htmlへの単純なリダイレクトを構成します。
Webサイトが次のように構成されていることを前提としています。
元の仮想ホスト構成を想定
<VirtualHost *:80>
ServerName example.com
. . .
</VirtualHost>
リダイレクトの構成は、2つのRedirectディレクティブを使用するのと同じくらい簡単です。
元の構成に追加されたリダイレクト
<VirtualHost *:80>
ServerName example.com
Redirect permanent /products.html /offer.html
Redirect permanent /services.html /offer.html
. . .
</VirtualHost>
Redirectディレクティブは、リダイレクトする必要のある元のアドレスと、新しいページの宛先アドレスを受け入れます。 ここでの変更は一時的なものではないため、ディレクティブでもpermanentを使用しました。 サイトのコンテンツを移動するときに、訪問者に不要なNot Foundエラーが表示されないようにするために、このようなリダイレクトをいくつでも使用できます。
結論
これで、リクエストを新しい場所にリダイレクトする知識が得られました。 一時的なリダイレクトを不適切に使用すると検索ランキングが低下する可能性があるため、必ず正しいリダイレクトタイプを使用してください。
安全なSSL接続を強制するなど、HTTPリダイレクトには他にも複数の用途があります(つまり、 httpの代わりにhttpsを使用し、すべての訪問者がWebサイトのwww.プレフィックス付きアドレスにのみアクセスするようにします。
リダイレクトを正しく使用すると、現在のWebプレゼンスを活用しながら、必要に応じてサイト構造を変更できます。 訪問者をリダイレクトする方法について詳しく知りたい場合は、Apacheの公式ドキュメントのmod_aliasおよびmod_rewriteセクションにこのテーマに関する優れたドキュメントがあります。