≫mod_rewriteとは
いわゆる、リダイレクトという処理を行うのに便利なモジュールです。
モジュールの解説ドキュメントによれば
URLを操作するためのスイス製のアーミーナイフ
と例えられるほど、非常に複雑な処理を行えます。
URLからURLへ、同一サーバ内URLだろうが、別サーバURLだろうが問いません。
引数を含むCGIの動的URLを通常のHTMLファイルのような静的URLに見せることも可能です。
≫mod_rewriteの基本
インストールされていなければ、サーバのroot権限が無い限り新たにインストールすることは難しいかと思います。
インストールされている場合、使用するには2つの方法があります。
- httpd.confに設定する
- .htaccessに設定する
mod_rewriteを利用したり、設定する記述は、テキストとして書き込みます。
バーチャルサーバを使用している場合は、バーチャルサーバごとに記述する必要があります。≫サイトの引越し通知
そこで、ファイルが見つからない時のエラーページを用意して、一個のファイルで引越しを通知するという方法を考えるかもしれません。
あわせて、refreshタグで引っ越し先に飛ばしてしまうかもしれません。
しかし、どちらにしても、あるページを経由するというステップを避けることができません。
mod_rewriteはこの引越し通知に力を発揮します。
RewriteEngine on
RewriteRule ^/(.*)$ http://www.newserver.com/$1 [R=301,L]
とすることで、あるサーバへのリクエストを http://www.newserver.com/ にリダイレクトさせることができます。
この方法が有用な点は、R=301 という指定で、HTTPステータスコードの301(=Moved Permanently、永久に移動したという意味)を返した上で、URLを書き換えてジャンプさせることができるということです。
人が、ブラウザで普通にアクセスしていれば、何も気にせず新しいURLにアクセスすることができます。
URLの変更は、引越し先のページで告知すれば済みます。
また、ロボットのアクセスには、ステータスコード301によってURLが変更されたことがわかります。
Googleなら、引越し前のページにリンクしているリンク元を、引越し先に引き継ぐことができます。
ほぼ、PageRankを引き継げると言えます。
サイト内で、ディレクトリ構造を変更した場合は
RewriteEngine on
RewriteRule ^/abc/(.*)$ /new/$1 [R=301,L]
とすれば、/abc/ というディレクトリ内へのアクセスを /new/ へリダイレクトすることができます。
もしも、/abc/ の中の .html という拡張子のファイルだけ移動したいのであれば
RewriteEngine on
RewriteRule ^/abc/(.*)\.html$ /new/$1.html [R=301,L]
とします。
RewriteEngine on
RewriteRule ^/abc/(.*)$ /new/$1 [R=301,L]
RewriteEngine on
RewriteRule ^/def/(.*)\.html$ /new2/$1.html [R=301,L]
RewriteEngine on
RewriteRule ^/ghi/(.*)\.(html|htm)$ /new3/$1.$2 [R=301,L]
RewriteEngine on
RewriteRule ^/jkl/(.*)$ http://www.sample.com/$1 [R=301,L]
という感じで、複数の条件を連ねることもできます。
正規表現を使って複雑な条件を指定することが可能です。
≫動的ページを静的ページに見せる
その際は、URLの最後が .cgi で終る場合が多くなります。
URLの末尾が .cgi で終ると検索エンジンのロボットに無視されることが多くなります。
検索エンジンロボットは、引数によって些細に変化する動的ページにはあまり対応していないからです。
しかし、それなりにコンテンツとして価値のある動的ページは検索エンジンにクロールさせたいものです。
現時点では、おおまかに、引数付きのCGIへのリンクはクロールされる可能性が高いようです。
中でも、クエリー式(/sample.cgi?a=123&b=456)よりも、PATH_INFO式(/sample.cgi/123/456)の方が、クロールされやすいと言われています。
しかし、それらは、小細工でしかありません。
mod_rewriteを使えば、完全に静的ファイルへのアクセスで動的ファイルの結果を返すようにすることが可能です。
例えば、http://www.sample.com/cgi-bin/sample/sample.cgi?a=123&b=456
というURLを静的なアドレスでアクセスできるように以下のように設定します。
RewriteEngine on
RewriteRule ^/cgi-bin/sample/([0-9A-Za-z]+)/([0-9A-Za-z)]+)\.html$ /cgi-bin/sample/sample.cgi?a=$1&b=$2 [L]
すると、http://www.sample.com/cgi-bin/sample/123/456.html にアクセスすると、
http://www.sample.com/cgi-bin/sample/sample.cgi?a=123&b=456 にアクセスしたのと同じ結果が返るようになります。
ポイントは、クエリーに含まれるはずの引数データを、静的ファイルのURLパス内に含む形にしてアクセスを受け、mod_rewriteによってその情報を正規のクエリーに変換している点です。
見せかける静的アドレスはいか様でもかまいません。
mod_rewriteによって、変換できれば問題ありません。
ただし、CGIの引数によっては処理がかなり複雑になります。しかし、mod_rewriteなら見事に対応できるでしょう。
mod_rewrite のサンプル集も書いてみました。at 技林ブログ
≫参考にしたサイト
技林TOP > 自宅サーバ構築メモ > mod_rewrite