mod_rewriteで出来るApache2のURLリダイレクトを敢えてmod_perl2で行う
元ネタ
YAPC::Asia Tokyo 2012 の発表資料 「モダンmod_perl入門」 を最近読みまして、その中で紹介されていた内容を実際に試した備忘録をここに記します。
mod_rewirte
mod_rewirteはリダイレクトを実現するApacheの拡張モジュールで、以下の公式ドキュメントで解説されています。
例えばhttpd.confに以下のように書きます。
LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine on RewriteRule ^/foo\.html$ /bar.html [PT] RewriteLog /var/log/httpd/rewrite.log RewriteLogLevel 3
これでfoo.htmlへのアクセスがbar.htmlにリダイレクトされます。 その様子はrewirte.logファイルにログとして書き出されます。
mod_perl2では
PerlTransHandlerというフェーズに変換処理をはさみます。httpd.confに次のように書きます。
LoadModule perl_module modules/mod_perl.so PerlRequire /var/www/perl/startup.pl PerlTransHandler MyApache2::Trans
ここでstartup.plは単にパスの設定のみのコードです。
use lib qw(/var/www/perl); 1;
これで/var/www/perl/MyApache2/Trans.pmを実行できるようになります。
#!/usr/bin/perl package MyApache2::Trans; use strict; use warnings; use Apache2::RequestRec (); # for $r->uri() use Apache2::Const -compile => qw(DECLINED); sub handler { my $r = shift; my $uri = $r->uri(); # e.g. "/path/to/foo.html ### modify uri $uri =~ s/foo\.html$/bar.html/; $r->uri($uri); # set uri return Apache2::Const::DECLINED; } 1;