2007年1月1日月曜日

[Apache] mod_rewrite でURL要素をCGI引数にリライトする

A Users Guide to URL Rewriting with the Apache Webserver
Apache の mod_rewrite モジュールは必殺仕事人です。つまり、URL 操作を確実に行う最も粋なモジュールだということです。あなたが夢にまで見た、URL のあらゆる操作を殆ど全て実行することができます。その代償としてあなたは、その複雑さを許容しなければなりません。なぜなら mod_rewrite の最大の欠点は、初心者の理解と利用が困難な点にあるからです。 そしてまた Apache に熟練した者でさえ、mod_rewrite の新しい側面に出くわすのです。

まともに使ったこと無かったので、はまった。

概要は
・RewriteRule でリライトルールを規定する。
・条件判定したい場合は RewriteCond で規定する。
・正規表現が使える。
・RewriteRule に [PT] をつけると、URL はそのままで処理する。
・RewriteRule に [R] をつけると、リライト後の URL にブラウザを導く。
・リライト対象にクエリ文字列がある場合は、RewriteRule に [QSA] をつける。
・フラグは [QSA,PT] と複数指定も可。
と、URL操作に関してかなりできる。もちろんこれ以外にもいろいろできるので、様々なシーンで活躍しそう。

で、URL要素をCGI引数にリライトする簡単サンプル
$ vi /www/test/.htaccess
RewriteEngine on
RewriteBase /
RewriteRule ^(.+)/(.+)/(.+)/(.+)/$ test/rewrite.cgi?id=$1&mode=$2&page=$3&type=$4 [PT]

$ vi /www/test/rewrite.cgi
#!/usr/bin/perl
use strict;
use Cwd;
use CGI;

my $cgi = new CGI;
my $id = $cgi->param('id');
my $mode = $cgi->param('mode');
my $page = $cgi->param('page');
my $type = $cgi->param('type');
my $pwd = Cwd::getcwd();

printf( "Content-type: text/html\n\n" );
printf( "this is test page
pwd is $pwd" );
printf( "id is $id
mode is $mode
page is $page
type is $type" );
exit;
これで、http://servername/test/0000/1111/2222/3333/ にアクセスすると
this is test page
pwd is /www/test
id is 0000
mode is 1111
page is 2222
type is 3333
なんて感じでリライトされる。

参考
URL Rewriting Guide
mod_rewrite モジュールURL 書き換えエンジン
Apache Rewrite 機能の応用
mod_rewriteリファレンス
Apacheクックブック―Webサーバ管理者のためのレシピ集

0 件のコメント: