昨日の%ENVの問題、やっぱり他の人もぶちあたってた。奇しくも昨日同じ時間帯に同じ事で悩んでる人がCatalyst MLに投稿して、「あ、俺もそうだった!」的な人が書いた回答が以下



http://lists.rawmode.org/pipermail/catalyst/2006-June/008361.html



これだこれ。


ただその後のメールのやりとりを見ているとApache + FastCGIの設定ではもう少し工夫がいる、という報告がされている。


で、この後ちょっと色々試してみてたら、結局 ルートパスにそのままFastCGIハンドラをひもづけるとPATH_INFOが正しく設定されないってことらしい。







とりあえずデバッグ的にも問題なので、デフォルトで書いたlighttpd.confでstaticファイルはCatalystを通らないように設定。Perl互換正規表現が使えるのが嬉しい:



server.modules = (
...,
"mod_fastcgi",
"mod_rewrite"
);

...

url.rewrite-once = (
"^/((?!static).*)" => "/fastcgi.fcgi/$1"
)
fastcgi.server = (
"/fastcgi.fcgi/" => (
"MyApp" => (
....
)
)
)

で、状況把握のためにMyApp.pmでprepare_requestをオーバーライド:



BEGIN
{
if ($ENV{CATALYST_ENGINE} eq 'FastCGI') {
use Data::Dumper;
eval <<' EOCODE';
sub prepare_request {
my $self = shift;
my %args = @_;

my $env = $args{env};
print STDERR Dumper($env);
$self->NEXT::prepare_request(%args);
}
EOCODE
}
}

さて、これでhttp://myapp.com/hogeにアクセスしてログを見ると、%ENVの中身で気になるのはこの辺り:



'SCRIPT_NAME' => '/fastcgi.fcgi/hoge',
'HTTP_REFERER' => 'http://myapp.com/hoge’,
'SCRIPT_FILENAME' => '/path/to/MyApp/root/fastcgi.fcgi/hoge',
'REDIRECT_URI' => '/fastcgi.fcgi/hoge',
'REQUEST_URI' => '/hoge',
'DOCUMENT_ROOT' => '/path/to/root',

おーっと。REQUEST_URIに俺の欲しい物がそのまま入ってる!ってことで先ほどのMyAppの中に1行追加。



BEGIN
{
if ($ENV{CATALYST_ENGINE} eq 'FastCGI') {
use Data::Dumper;
eval <<' EOCODE';
sub prepare_request {
my $self = shift;
my %args = @_;

my $env = $args{env};
$env->{PATH_INFO} = $env->{REQUEST_URI};
$self->NEXT::prepare_request(%args);
}
EOCODE
}
}

今のところ、コレは俺的に結構美しい解。