NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

notfound強化案

差出人: さん
送信日時 2005/09/04 16:30
ML.NO [blosxom:0177]
本文:

北村と申します。はじめまして。

動的生成する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/

添付:

このメールには下記のメールが返信されています:

【PR】レシピブログ無料ホームページメーリス辞書