RewriteMap

Apache Web Serverのモジュールにmod_rewriteってのがある。
rewriteって名前の通り、何かを書き換えるモジュール。
何を書き換えるかというとURLを書き換える。
ちと野暮用でこの機能を使う必要が出てきたので、色々と試してみた。


野暮用、といっても page?uid=NULLGWDOCOMO でアクセスした場合に NULLGWDOCOMO の部分を特定の文字列に置換したい。
っていうことなんだけどね。
せっかくなので、ただ書き換えるのではなく機種毎に違う文字列を生成するように出来れば面白いなと思いながら試行錯誤の1時間ちょい。
出来た。
httpd.conf

RewriteEngine on
RewriteLock /tmp/rewrite.map.lock
RewriteMap uid-map prg:/usr/local/apache2/conf/uid.pl

.htaccess

RewriteEngine on
RewriteCond %{QUERY_STRING} (.*)[\?&]?uid=NULLGWDOCOMO(.*)
RewriteRule (.*) $1?%{QUERY_STRING}&uid=${uid-map:%{HTTP_USER_AGENT}|NULLGWDOCOMO}

RewriteCondにUserAgentがDoCoMoってのも付け足さないと正確じゃないな。
これで .htaccess を置いたURLに
page?uid=NULLGWDOCOMO
とDoCoMo携帯でアクセスすると
page?uid=NULLGWDOCOMO&uid=[uid.plで生成した文字列]
になる。
uidパラメータが2つになるのはご愛嬌…ってことで。
PHPの場合、後続パラメータ名で上書きされるから問題はない。
ちなみに、 uid.pl

#!/usr/bin/perl

$| = 1; # エルじゃなくパイプ

while (<STDIN>)
{
print $_;
}

これで、ユーザーエージェントがそのまま表示される。
$| = 1;
これをやらないと、Apacheがハングアップするので注意。
(実際のは、ちゃんと12文字生成するようにしてある)

コメントを残す

メールアドレスが公開されることはありません。