北村と申します。はじめまして。
動的生成するblosxomで、「存在しないURL」を要求された場合に
404 Not Foundを返すためのプラグイン"notfound"
http://www.akatsukinishisu.net/itazuragaki/blosxom/notfound.html
を作成しているのですが、
これを利用頂いているにーやんさんのブログ
http://niiyan.s8.xrea.com/blosxom/blosxom/20050902_notfound_plugin.htm
で、Not Foundが返らない場合があることの指摘がありました。…(0)
> たとえば、
> http://niiyan.s8.xrea.com/blosxom/int/
> でアクセスしても、
> http://niiyan.s8.xrea.com/blosxom/internet/
> と同じページが表示されます。
何故このような動作になるのか調べてみたところ、
blosxom.cgiの338行目あたりの、
> # Only stories in the right hierarchy
> $path =~ /^$currentdir/ or $path_file eq "$datadir/$currentdir" or next;
この最初の正規表現マッチで、URLのディレクトリ部分が
ファイルパスの先頭部分のみ合っていればOKにしてしまうことが
原因であるようです。
対処として、まず最初に上記の行を以下のように
書き換えることを思いつきました。…(1)
!$currentdir or $path =~ /^$currentdir(?:/|$)/ or $path_file eq "$datadir/$currentdir" or next;
しかし、個人的に「可能であればなるべくblosxom.cgiは変更せず、
プラグインで対処したい」という考えがあったので、
もう一つの案として、notfoundプラグインに以下のfilterサブルーチンを
追加することを考えました。…(2)
sub filter {
my ($pkg, $files_ref) = @_;
return 1 unless ($blosxom::path_info);
# $path_infoのディレクトリ部分に一致しないファイルを除去
my $path_dir = "$blosxom::datadir/$blosxom::path_info";
return 1 if ($path_dir =~ m{/[^/]+.[^/]+$});
foreach my $f (keys %$files_ref) {
$f =~ m{^$path_dir/} or delete($files_ref->{$f});
}
1;
}
ローカルで動作確認した限りでは、
(1)か(2)どちらかの対処を行えば(0)の問題は解消され、
問題なく動作しているようでした。
しかし、(1)(2)の対処について、
まだ自分が気付いていないような欠点や、
他のプラグインとの組合せで発生するような不具合などが
あるかも知れないので、
他の方から見て、もし不具合等が見つかりましたら
ご指摘頂けると有難いです。
よろしくお願いします。
--
北村曉 kits@…
http://www.akatsukinishisu.net/