Apache mod_rewriteでリダイレクトルールを作成する方法【完全解説】

Apacheのmod_rewriteは、URLを書き換えるための強力なモジュールであり、WebサイトのリダイレクトやURLの美化、アクセス制御などに活用されます。特に、古いURLを新しいURLへ転送するリダイレクト処理は、SEO対策やユーザビリティ向上において重要な役割を果たします。

mod_rewriteの特徴は、単純なルールから複雑な正規表現を用いた条件付きリダイレクトまで、多様な処理を実現できる点です。しかし、その柔軟性ゆえに設定が煩雑になりがちで、思わぬリダイレクトループや設定ミスを引き起こすこともあります。

本記事では、mod_rewriteを使ったリダイレクトルールの作成手順を、初心者にもわかりやすく段階的に解説します。まずmod_rewriteの基本概念を理解し、Apacheでの有効化方法を確認した後、具体的なリダイレクトルールの記述方法を学びます。また、よくある設定ミスやリダイレクトループの防止策についても触れ、実際の運用に役立つ知識を提供します。

これにより、Apache環境で効率的にリダイレクトを設定し、Webサイトの管理や最適化をスムーズに行うことが可能になります。

目次

mod_rewriteとは


mod_rewriteは、Apache HTTPサーバーのモジュールであり、リクエストされたURLを任意の形式に書き換えることができる強力なツールです。これにより、動的URLを静的に見せかけたり、古いURLを新しいURLに転送したりすることが可能になります。

mod_rewriteの役割と特徴


mod_rewriteの主な役割は、以下のようなリクエストURLの操作です。

  • リダイレクト:特定のURLを別のURLへ転送します。301(恒久的)や302(一時的)などのHTTPステータスコードを使用します。
  • URLの書き換え:訪問者には変わらないURLが表示されつつ、内部的には異なるURLに変換して処理します。
  • 条件付きリダイレクト:特定の条件を満たした場合のみリダイレクトすることが可能です。

mod_rewriteの利用場面

  • SEO対策:サイトリニューアル時のURL変更に伴うリダイレクトで、検索エンジンの評価を維持します。
  • ユーザービリティの向上:シンプルで覚えやすいURLを提供し、ユーザーの体験を向上させます。
  • セキュリティ対策:特定のアクセスを制限したり、不正なURLをブロックするために活用されます。

mod_rewriteのインストール確認


Apacheにmod_rewriteがインストールされているか確認するには、以下のコマンドを実行します。

apachectl -M | grep rewrite

結果としてrewrite_moduleが表示されれば、mod_rewriteがインストールされています。

mod_rewriteは、Apacheの基本機能を大きく拡張する便利なモジュールであり、Webサイトの柔軟な運用に不可欠です。次のセクションでは、mod_rewriteを有効化する具体的な手順について解説します。

mod_rewriteを有効化する方法


Apacheでmod_rewriteを使用するには、モジュールを有効化する必要があります。多くのサーバーではデフォルトでmod_rewriteがインストールされていますが、無効化されている場合もあるため、設定の確認と有効化の手順を解説します。

mod_rewriteが有効か確認する


まず、mod_rewriteが既に有効になっているかを確認します。以下のコマンドを実行してください。

apachectl -M | grep rewrite

rewrite_module (shared)と表示されれば、mod_rewriteは既に有効です。表示されない場合は、以下の手順でmod_rewriteを有効化します。

mod_rewriteを有効化する手順

1. Apacheモジュールを有効化

sudo a2enmod rewrite


このコマンドでmod_rewriteモジュールを有効化します。Module rewrite already enabledと表示される場合は、すでに有効です。

2. Apacheの設定ファイルを編集

次に、Apacheの設定ファイルを編集して、.htaccessがリダイレクトルールを処理できるようにします。
設定ファイルは以下のいずれかです。

sudo nano /etc/apache2/sites-available/000-default.conf

または、特定のバーチャルホストの設定ファイルを編集します。

<VirtualHost>ブロック内に以下のように記述します。

<Directory /var/www/html>
    AllowOverride All
</Directory>

これにより、.htaccessでmod_rewriteのルールが適用されます。

3. Apacheを再起動

設定を反映させるためにApacheを再起動します。

sudo systemctl restart apache2

動作確認


.htaccessファイルを作成し、以下の内容を記述してテストします。

RewriteEngine On
RewriteRule ^test$ /index.html [L]

ブラウザでhttp://example.com/testにアクセスし、index.htmlが表示されれば設定が正しく反映されています。

これでmod_rewriteの有効化が完了しました。次は、.htaccessファイルの基本的な構造について解説します。

.htaccessの基本構造


.htaccessは、Apacheでディレクトリごとに設定を変更できる設定ファイルです。mod_rewriteを使用してリダイレクトルールを記述する際に多く利用されます。このファイルを使えば、Webサーバーの再起動なしでルールを反映させることが可能です。

.htaccessファイルの設置場所


.htaccessファイルは、リダイレクトやアクセス制御を行いたいディレクトリに設置します。例えば、/var/www/htmlにWebサイトがある場合、そのディレクトリ内に.htaccessを配置します。

/var/www/html/.htaccess

.htaccessの基本構文


.htaccessファイルでmod_rewriteを使う場合、以下の基本構文で設定します。

RewriteEngine On
RewriteRule パターン 置換パス [オプション]
  • RewriteEngine On:mod_rewriteを有効化する宣言です。これが記述されていないとリダイレクトが機能しません。
  • RewriteRule:リダイレクトルールの記述で、条件にマッチしたURLを指定のパスに書き換えます。
  • パターン:URLの正規表現で、リダイレクト対象のパスを記述します。
  • 置換パス:リダイレクト先のURLまたはパスです。
  • オプション:リダイレクトの種類や処理の終了などの動作を指定します。

簡単な例


以下は、/old-pageへのアクセスを/new-pageにリダイレクトする例です。

RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
  • R=301:301リダイレクト(恒久的)を指定します。
  • L:ルールの終了を意味し、これ以降のルールは適用されません。

.htaccessの注意点

  • .htaccessファイルの記述ミスは、Webサイト全体の動作に影響を与える可能性があります。
  • アクセス権限に注意し、.htaccessファイルは644(rw-r--r--)のパーミッションに設定してください。
sudo chmod 644 /var/www/html/.htaccess
  • 必ず設定後にApacheのエラーログを確認し、問題が発生していないかチェックします。
sudo tail -f /var/log/apache2/error.log

次は、具体的なリダイレクトルールの作成方法について解説します。

基本的なリダイレクトルールの作成方法


mod_rewriteを使用したリダイレクトルールは、簡単な設定から複雑な条件付きリダイレクトまで幅広く対応可能です。ここでは、最も基本的な301リダイレクトや302リダイレクトの記述方法を解説します。

301リダイレクト(恒久的なリダイレクト)


301リダイレクトは、リソースが恒久的に移動したことを示します。検索エンジンにも新しいURLが伝達されるため、SEOの観点でも重要です。

以下は、/old-page/new-pageにリダイレクトする例です。

RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
  • ^old-page$old-pageというURLに完全一致する場合に適用します。
  • /new-page:リダイレクト先のURLです。
  • R=301:リダイレクトの種類を301(恒久的)に設定します。
  • L:このルールが適用されたら以降のルールを無視します。

302リダイレクト(一時的なリダイレクト)


302リダイレクトは、リソースが一時的に移動したことを示します。ユーザーは新しいURLに転送されますが、検索エンジンは元のURLを維持します。

以下は、/temporary-page/maintenanceに一時的にリダイレクトする例です。

RewriteEngine On
RewriteRule ^temporary-page$ /maintenance [R=302,L]
  • R=302:一時的なリダイレクトを示します。

ドメイン全体のリダイレクト


サイト全体を新しいドメインにリダイレクトするには、以下のように記述します。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldsite\.com [NC]
RewriteRule ^(.*)$ http://newsite.com/$1 [R=301,L]
  • RewriteCond %{HTTP_HOST} ^oldsite\.com:アクセスされたホスト名がoldsite.comである場合に適用します。
  • http://newsite.com/$1:元のURLパスを維持したまま、新しいドメインへ転送します。
  • [NC]:ホスト名の大文字小文字を無視します。

特定のファイルをリダイレクト


特定のファイルを新しいファイルに転送するには、以下のように設定します。

RewriteEngine On
RewriteRule ^oldfile\.html$ /newfile.html [R=301,L]

リダイレクトの確認方法


リダイレクト設定後は、ブラウザで該当URLにアクセスし、正しく転送されるか確認します。また、以下のコマンドでHTTPステータスコードをチェックできます。

curl -I http://example.com/old-page


リダイレクトが成功していれば、HTTP/1.1 301 Moved Permanentlyが表示されます。

これで基本的なリダイレクトルールの作成は完了です。次は、正規表現を使ったより高度なリダイレクト方法について解説します。

正規表現を使ったリダイレクトルール


mod_rewriteの強力な機能のひとつが正規表現を使ったリダイレクトです。これにより、URLの一部だけを動的に書き換えたり、パターンに一致する複数のURLを一度に処理することが可能になります。

正規表現の基本構文

  • ^:URLの先頭を示します。
  • $:URLの末尾を示します。
  • .:任意の1文字に一致します。
  • .*:任意の長さの文字列に一致します。
  • ():グループ化して、マッチした部分を再利用できます。
  • [A-Za-z0-9]:特定の文字や数字に一致します。

基本的な正規表現のリダイレクト例

1. 拡張子を変更するリダイレクト

.htmlのURLを.phpに自動で置き換えます。

RewriteEngine On
RewriteRule ^(.*)\.html$ $1.php [R=301,L]
  • (.*):任意の文字列に一致します。
  • \..をエスケープして、実際のドットを意味します。
  • $1(.*)でマッチした部分を再利用します。

/example.html/example.phpにリダイレクトされます。

2. 特定のディレクトリ以下をすべてリダイレクト

/blog/以下のすべてのURLを/archive/に移動します。

RewriteEngine On
RewriteRule ^blog/(.*)$ /archive/$1 [R=301,L]
  • blog/(.*)/blog/に続く任意の文字列をキャプチャします。
  • /archive/$1/archive/にキャプチャした部分を付加します。

/blog/post1/archive/post1

複数のURLパターンを1つのルールで処理


例えば、/product/item123/service/item456 など、item以降が変化する場合に同じ処理を適用します。

RewriteEngine On
RewriteRule ^(product|service)/item([0-9]+)$ /catalog/item$2 [R=301,L]
  • (product|service)productまたはserviceに一致します。
  • item([0-9]+)itemの後に続く数字をキャプチャします。
  • $2:キャプチャした数字部分を再利用します。

/product/item123/catalog/item123

wwwなしへ統一するリダイレクト


すべてのURLでwww.を除去し、https://example.comに統一します。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
  • %{HTTP_HOST}:アクセスされたホスト名を取得します。
  • ^www\.(.*)$www.が先頭にある場合を対象にします。
  • %1(.*)でキャプチャしたホスト名を再利用します。

http://www.example.com/pagehttps://example.com/page

リダイレクトの検証


正規表現を使ったリダイレクトは強力ですが、設定ミスがあると意図しないURLがリダイレクトされることがあります。curlコマンドを使って動作を確認しましょう。

curl -I http://example.com/blog/post1


HTTP/1.1 301 Moved Permanentlyが表示されればリダイレクトは正常です。

正規表現を使ったリダイレクトを適切に設定することで、複雑なURLの書き換えや移行を効率的に管理できます。次はクエリ文字列を処理する方法について解説します。

クエリ文字列を処理する方法


Apacheのmod_rewriteでは、URLパスだけでなく、クエリ文字列(?key=valueの形式)を処理してリダイレクトを行うことが可能です。これにより、動的なURLを静的なURLに変換したり、SEOのためにURLを簡潔にすることができます。

クエリ文字列のリダイレクトの基本


通常のRewriteRuleでは、URLパスのみにマッチしますが、クエリ文字列を対象とする場合はRewriteCondを使用します。
/search?keyword=apache/results/apache にリダイレクトする場合

RewriteEngine On
RewriteCond %{QUERY_STRING} ^keyword=(.*)$
RewriteRule ^search$ /results/%1? [R=301,L]
  • %{QUERY_STRING}:現在のクエリ文字列を参照します。
  • ^keyword=(.*)$keyword=の後に続く任意の文字列をキャプチャします。
  • %1RewriteCondでキャプチャしたクエリの値を再利用します。
  • ?:リダイレクト先のURLからクエリ文字列を削除します。

複数のクエリパラメータを処理する


複数のクエリ文字列を対象にして、URLを変換する方法を紹介します。
/search?category=books&item=123/catalog/books/123 にリダイレクト

RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=([^&]*)&item=([0-9]+)$
RewriteRule ^search$ /catalog/%1/%2? [R=301,L]
  • category=([^&]*)categoryパラメータの値をキャプチャします。
  • item=([0-9]+)itemパラメータの数値部分をキャプチャします。
  • /catalog/%1/%2:キャプチャしたcategoryitemをパスに適用します。

結果例/search?category=books&item=123/catalog/books/123

特定のクエリ文字列を削除


クエリ文字列を削除して、URLを簡潔にする方法です。
/page?id=567/page にリダイレクトし、クエリ部分を除去

RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=[0-9]+$
RewriteRule ^page$ /page? [R=301,L]
  • ? をリダイレクト先に追加することで、クエリ文字列を削除します。

任意のクエリを特定のURLに統一


すべてのクエリ文字列を無視して特定のページに統一する方法です。
/login?user=admin でも /login?type=guest でも /login にリダイレクト

RewriteEngine On
RewriteRule ^login$ /login [R=301,L]


この設定では、クエリに関わらずURLパスのみが処理されます。

クエリ文字列を使った条件付きリダイレクト


特定のクエリ文字列がある場合のみリダイレクトし、それ以外は通常の処理を行います。
/download?file=report の場合に限り、/secure/report へリダイレクト

RewriteEngine On
RewriteCond %{QUERY_STRING} ^file=report$
RewriteRule ^download$ /secure/report [R=301,L]

動作確認方法


リダイレクト設定後は、以下のコマンドで動作を確認します。

curl -I "http://example.com/search?keyword=apache"


HTTP/1.1 301 Moved Permanently が表示されればリダイレクトは成功です。

クエリ文字列を適切に処理することで、URLの可読性が向上し、SEOの強化やユーザービリティの向上が実現します。次は、特定のディレクトリやファイルをリダイレクトする方法について解説します。

特定のディレクトリやファイルをリダイレクトする方法


mod_rewriteを使うと、特定のディレクトリやファイルのみをリダイレクトすることができます。これにより、サイト構造の変更や不要なページの整理をスムーズに行うことが可能です。

特定のディレクトリ全体をリダイレクト


特定のディレクトリ以下のすべてのURLを新しいディレクトリにリダイレクトするには、以下のように設定します。
/old-directory/ 以下のURLを /new-directory/ にリダイレクト

RewriteEngine On
RewriteRule ^old-directory/(.*)$ /new-directory/$1 [R=301,L]
  • old-directory/(.*)old-directory配下の任意のURLにマッチします。
  • $1:キャプチャした部分を再利用し、ディレクトリ以下の構造を維持します。

結果例

  • /old-directory/about/new-directory/about
  • /old-directory/contact/new-directory/contact

特定のファイルをリダイレクト


特定のファイルのみをリダイレクトしたい場合は、ファイル名を直接指定します。
/oldfile.html/newfile.html にリダイレクト

RewriteEngine On
RewriteRule ^oldfile\.html$ /newfile.html [R=301,L]
  • oldfile\.html:ピリオドをエスケープしてファイルを正確に指定します。

特定の拡張子のファイルを一括リダイレクト


特定の拡張子(例:.php)のファイルをすべて.htmlにリダイレクトする方法です。
:すべての.phpファイルを.htmlに変更

RewriteEngine On
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]
  • (.*)\.php:任意の文字列に続く.phpファイルをキャプチャします。
  • $1.html:キャプチャした部分に.htmlを付与します。

結果例

  • /page.php/page.html
  • /contact.php/contact.html

特定の拡張子を削除してリダイレクト


URLから拡張子(例:.html)を削除してシンプルにする場合の設定です。
/index.html/index にリダイレクト

RewriteEngine On
RewriteRule ^(.*)\.html$ /$1 [R=301,L]
  • $1:キャプチャした部分を拡張子なしで再利用します。

特定のファイルを別ドメインにリダイレクト


ファイルやディレクトリを別のドメインにリダイレクトすることも可能です。
/download.ziphttps://cdn.example.com/download.zip にリダイレクト

RewriteEngine On
RewriteRule ^download\.zip$ https://cdn.example.com/download.zip [R=301,L]

ディレクトリをファイルにリダイレクト


特定のディレクトリにアクセスした際に、特定のファイルを表示する方法です。
/blog/index.html にリダイレクト

RewriteEngine On
RewriteRule ^blog/$ /index.html [R=301,L]

動作確認


リダイレクト設定後、以下のコマンドで動作を確認します。

curl -I http://example.com/old-directory/page


HTTP/1.1 301 Moved Permanentlyが返されればリダイレクトは成功です。

特定のディレクトリやファイルのリダイレクトは、サイト構造変更時に欠かせません。次は、リダイレクトループを防ぐコツとトラブルシューティングについて解説します。

リダイレクトループを防ぐコツとトラブルシューティング


mod_rewriteを使用する際、設定ミスによってリダイレクトループが発生することがあります。これは、リクエストが無限に繰り返され、最終的にブラウザが「リダイレクトが多すぎます」とエラーを表示する状況です。ここでは、リダイレクトループを防ぐ方法と、問題が発生した場合のトラブルシューティング手順を解説します。

リダイレクトループが発生する原因


リダイレクトループの主な原因は以下の通りです。

  • リダイレクト先がリダイレクト元と同じパスを指定している
  • 不適切なRewriteCond(条件分岐)を設定している
  • HTTPSリダイレクトやwwwリダイレクトが重複している
  • ルールの優先順位が不適切で矛盾が生じている

リダイレクトループを防ぐ方法

1. リダイレクトの条件を明確に指定する

特定の条件でのみリダイレクトを実行し、それ以外は適用されないようにします。
:HTTPSリダイレクトでリダイレクトループを防ぐ設定

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
  • RewriteCond %{HTTPS} off:HTTPSではない場合のみリダイレクトを実行します。

2. ホスト名の統一を行う場合の条件指定

wwwあり・なしのリダイレクトでループを防ぐ例です。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
  • %1:キャプチャしたホスト名を使ってリダイレクトします。

3. 同一URLでのリダイレクトを防止

リダイレクト先と同じURLに転送されるループを防ぎます。
/old/newにリダイレクトされる設定でループを防ぐ

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/new$
RewriteRule ^old$ /new [R=301,L]
  • !^/new$:リダイレクト先がすでに/newである場合はリダイレクトを実行しません。

4. キャッシュをクリアする

リダイレクトループが発生した場合、ブラウザのキャッシュに古いリダイレクト情報が残っている可能性があります。キャッシュをクリアしてから再度アクセスしてください。

sudo systemctl restart apache2

トラブルシューティング方法

1. エラーログを確認する

リダイレクトループが発生している場合は、Apacheのエラーログを確認します。

sudo tail -f /var/log/apache2/error.log


ログにToo many redirectsなどのメッセージが表示されていれば、リダイレクトループが発生しています。

2. curlで動作確認

以下のコマンドでリダイレクト状況を確認します。

curl -I http://example.com/old


結果例

HTTP/1.1 301 Moved Permanently
Location: http://example.com/new


リダイレクトが意図した通りに行われているか確認できます。

3. RewriteLogで詳細を確認(Apache 2.4以前)

Apache 2.4以前ではRewriteLogを使ってリダイレクトの動作をログに記録できます。

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3


注意:Apache 2.4以降ではRewriteLogは非推奨です。LogLevelディレクティブを使って詳細なログを取得します。

LogLevel alert rewrite:trace3

まとめ

  • 条件を明確に設定してループを防止
  • エラーログやcurlコマンドで動作確認を行う
  • リダイレクト先が同一URLにならないようにRewriteCondで除外条件を設定

次は、まとめとしてmod_rewriteを使ったリダイレクトルール全体の流れを振り返ります。

まとめ


本記事では、Apacheのmod_rewriteを使用したリダイレクトルールの作成方法について、基本から応用まで解説しました。

mod_rewriteの概要と有効化の手順を確認し、.htaccessファイルを使った基本的な301リダイレクトや302リダイレクトの設定方法を説明しました。さらに、正規表現を用いた複雑なリダイレクトや、クエリ文字列の処理方法、特定のディレクトリやファイルを対象としたリダイレクトルールについても紹介しました。

リダイレクトループを防ぐための条件付きリダイレクトや、トラブルシューティングの方法も取り上げ、エラーログやcurlを活用して問題を特定する方法を示しました。

適切なmod_rewriteの設定は、SEOの向上やユーザビリティの強化、サイト移行時の円滑なリダイレクト処理に不可欠です。この記事を参考に、効果的なリダイレクトルールを作成し、サイトの最適化を進めてください。

コメント

コメントする

目次