週末には少しPerlを。

Perlスクリプトの学習日記です。

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;

参考文献