RewriteモジュールでURLを書き換える方法

RewriteモジュールでURLを書き換える方法をメモしておきたいと思います。.htaccessでRewriteモジュールを使用すればアクセスしたURLとは別のURLに自動的に飛ばすことができます。サイトを移転した際など、異なるURLからのアクセスが必要な時に役立ちそうです。

今回は、http://www.testsite.com/oldurl/index?id=(num)にアクセスした際に、
http://www.testsite.com/newurl/index?id=(num)へidも継承して移動するようにしたいと思います。

.htaccessの変更

.htaccessファイルに下記を記入します。


<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_URI} oldurl/index
  RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
  RewriteRule ^(.*)$ /newurl/index\?$2 [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>~%lt;/IfModule>
自動的に別のURLに飛ばすために、.htaccessのmod_rewriteという機能を利用します。

RewriteEngine on
mod_rewriteによるURLの書き換えを有効にするために、RewriteEngine onを記述します。

RewriteBaseは書き換えのベースとなるパスを指定するディレクティブです。ベースパスが自明である場合は記述を省くことができます。

RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteCondで、環境変数やその他の条件に応じた判定を付加します。条件にマッチした場合のみ、次に記述されたRewriteRuleが適応されます。 QUERY_STRINGにある^id=([0-9]+)$でidを取得します。 ^は文字列の先頭、$は文字列の最後を指します。[0-9]+は0~9の数字の集合体を指します。

RewriteRule ^(.*)$ /newurl/index\?$2 [R=301,L]
URLの書き換えを行います。RewriteCondでマッチした場合、/newurl/index\?$2にURLを書き換えます。 $2には、取得したidが記述されます。
R=301は、ステータスコード301でリダイレクトする機能です。 ステータスコード301は、サイトが移転したことを意味します。
Lは、条件にマッチした場合そこで判定を終了する機能です。

これで、http://www.testsite.com/oldurl/index?id=42を開こうとしたとき、http://www.testsite.com/newurl/index?id=42へidもそのまま自動的にアクセスできるようになりました。

参考

mod_rewriteリファレンス|dawgsdk.org
Webサイトを移転したとき|Scuderia Web