Make sure that the document extension is .php and that your server supports PHP documents.
"; if ($tmp_uri == "all") { // OK // $paginate_current_page = "all"; } else { $tmp_uri2 = $tmp_uri; $pattern = '/\d+/'; $replacement = ''; $tmp_uri3 = preg_replace($pattern, $replacement, $tmp_uri2); if ($tmp_uri3 == "") { //print "Checking3...
"; #---- Maybe Ok ---- if ( is_numeric($tmp_uri2) ) { $paginate_current_page = $tmp_uri2; } } } } } } $paginate_num_pages = 1; $paginate_num_sections = 9; //$paginate_current_page = @$_GET['page']; // Pin page selector to a valid number (or 'all') if($paginate_current_page=='') $paginate_current_page = '1'; if($paginate_current_page != 'all') { if($paginate_current_page == 'first') $paginate_current_page = 1; elseif($paginate_current_page == 'last') $paginate_current_page = 1; elseif($paginate_current_page < 1) $paginate_current_page = 1; elseif($paginate_current_page > 1) $paginate_current_page = 1; $paginate_sections = array( 0 , 9); $paginate_top_section = $paginate_sections[$paginate_current_page-1]+1; $paginate_bottom_section = $paginate_sections[$paginate_current_page]; } else { $paginate_top_section = 1; $paginate_bottom_section = 9; } /* if(isset($_SERVER['QUERY_STRING'])) { $paginate_self = '&' . $_SERVER['QUERY_STRING'] . '&'; $paginate_self = preg_replace("/&page=[^&]*&/", "&", $paginate_self); $paginate_self = substr($paginate_self, 1, strlen($paginate_self) - 1); if($paginate_self == '&') $paginate_self = ''; else $paginate_self = htmlentities($paginate_self); } else { $paginate_self = ''; } */ //if ( strlen($_SERVER{'REQUEST_URI'}) >= $uri_maxlength ) //{ /* It is possible to apply a /attack. A server resource is spent by making long String process inside. Although it can say that it is not great processing load, it is steadily from a small thing. However, restriction by HTTP GET is received in this case. For example http://some.url.com/archives/cat2/index.php/////////////////////////////////////////////////////////////////////////////////page/3 Umm.... It is also in such cases.... http://some.url.com/archives////////////////////////cat2/index.php/////////////////////////////////////////////////////////////////////////////////page/3 http://some.url.com///////////////////////////////////////archives////////////////////////cat2/index.php/////////////////////////////////////////////////////////////////////////////////page/3 */ //It is not secure to acquire from the above-mentioned reason to URI. //Since the URI serves as a base when it links URL again after attaching ///purposely, it unites and is also unsavory. $paginate_self = 'http://debz-di.kabocha.to/archives/cat1/movabletype//' . $paginate_page_selector; //} ?>
2006年08月22日
MovableTypeのTrackBackの処理を変えてみる。
T-4さんからご指摘頂いた通りで、MovableTypeで「トラックバックのThrottole」によってトラックバック受付が出来ない状況になっていました。
どういうことかをまず説明します。
mt-config.cgiには、以下の記述を行うことができます。
・OneHourMaxPings
・OneDayMaxPings
Pingsというのは、まあ、簡単に言いますとトラックバックです。
MovableType3.2のマニュアルによりますと
OneHourMaxPings =item * OneDayMaxPings
OneHourMaxPingsは、特定のブログに対するトラックバックについて、1時間に受けつけられる最大値を設定できます。初期値は10です。OneDayMaxPings は、特定のブログに対するトラックバックについて、1日に受けつけられる最大値を設定できます。初期値は50です。これらは、ThrottleSecondsで制御できないトラックバック・スパムを制限することに利用できます。
ということになっています。
このエラーはトラックバックを送ろうとしている相手側に「403 Throttled」のエラーメッセージを表示しますが、受け手側には「エラーログが残らない」ようです。(設定で変更できるのかどうかはわかりませんが・・・)
もし、SPAMが多ければ、OneDayMaxPingsを越えてしまって、トラックバックを受け付けることができなくなってしまいます。しかも、受け手側は一切そのことに気が付きません。さあ、困った。
一応、403 ThrottledでGoogleで調べてみると、ip addressを組み合わせて対応されている方もいらっしゃいます。
ソースを眺めてみます。
package MT::App::Trackback;
sub _builtin_throttle {
my ($eh, $app, $tb) = @_;
my $user_ip = $app->remote_ip;
use MT::Util qw(offset_time_list);
my @ts = offset_time_list(time - 3600, $tb->blog_id);
my $from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
require MT::TBPing;
if ($app->config('OneHourMaxPings')
<= MT::TBPing->count({ blog_id => $tb->blog_id,
created_on => [$from] },
{range => {created_on => 1} })) {
return 0;
}
@ts = offset_time_list(time - $app->config('ThrottleSeconds')*4000 - 1,
$tb->blog_id);
$from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
my $terms = {
blog_id => $tb->blog_id,
created_on => [$from]
};
my $count = MT::TBPing->count($terms, {range => {created_on => 1} });
if ($count >= $app->config('OneDayMaxPings')) {
return 0;
}
return 1;
}
で、「コメント」側・・・は、長いから割愛しますが、「ThrottleSeconds」はIPベースでのDoSに対しての攻撃に対して有効であると考えられます。
しかしながら、トラックバック側は上記のような処理です。
例えば、「閾値(しきいち)」を上げて対応しても、もしかしたら受け取れなくなってしまっているかもしれない。更に、その状態になっているかどうか、管理画面上でぱっと見で判断できません。
とりあえず受け付けておいて処理をすべき「cf. Qmail」なのではないかと思ったりしますが、所詮はメールのように絶対的に届かなくては困るという程のツールではないという扱いなのでしょうか。
・・・さて、まあ、そんなことは置いときまして、連続したIPからのDoSトラックバックを拒否し、IPBanし、更にはメールを送る、というコメントの場合と同様のソースにちょっと書き換えてみました。
この辺り、イロイロとロジック的には考えられるところでしょうし、人各々捕らえ方も違うかなとは思いますけれども、私としてはDoSを防げればよいかな、と、そんな風に思っております。本当に1PingごとにIPローテーションしてきたら、元のでも、これでも、意味を成しませんから。
_builtin_throttleの大本は、何かあったときのために_builtin_throttle_org とか、そんな名前に変更しておきます。
一応、ちょっとしたテストでは動いているようです。同blogに対して複数のTrackBackを送ろうとかするとちゃんと403 Throttledになります。
きっちりIPBANまで動いてくれるのかどうかは、まだうまくチェックできていませんが・・・
mt-config.cgiのThrottleSeconds(デフォルト値20)の間に同一IPからPingが来た場合のみ排除します。 configに変数を追加した上で、もうちょっと長い時間を指定してもいいのかもしれませんが・・・。
とりあえず、これで様子見してみます。
※Movebletype 3.31JPのみでテスト。lib/MT/App/Trackback.pmを書き換えてくださいまし。
お持ち帰り用ソース テキストファイル
以下そーす。...use MT::Utilが重複しやがってますケド...ま、まあとりあえず動いてます(汗
sub _builtin_throttle {
my ($eh, $app, $tb) = @_;
my $user_ip = $app->remote_ip;
use MT::Util qw(offset_time_list);
my $throttle_period = $app->{cfg}->ThrottleSeconds;
return 1 if ($throttle_period <= 0); # Disabled by ThrottleSeconds 0
my $eh = shift;
my $app = shift;
my ($entry) = @_;
require MT::Util;
my @ts = offset_time_list(time - $throttle_period,
$tb->blog_id);
my $from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
#if Existed TB Ping , Goto Error
if (MT::TBPing->count({ ip => $user_ip,
blog_id => $tb->blog_id,
created_on => [$from] },
{range => {created_on => 1} })) {
return 0;
}
@ts = offset_time_list(time - $throttle_period * 10 - 1,
$tb->blog_id);
$from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
my $count = MT::TBPing->count({ ip => $user_ip,
created_on => [$from],
blog_id => $entry->blog_id },
{ range => {created_on => 1} });
if ($count >= 8)
{
require MT::IPBanList;
my $ipban = MT::IPBanList->new();
$ipban->blog_id($entry->blog_id);
$ipban->ip($user_ip);
$ipban->save();
$ipban->commit();
$app->log({
message => $app->translate("IP [_1] banned because comment rate exceeded 8 comments in [_2] seconds.", $user_ip, 10 * $throttle_period ),
class => 'comment',
category => 'ip_ban',
blog_id => $entry->blog_id,
level => MT::Log::INFO(),
metadata => $user_ip,
});
require MT::Mail;
my $author = $entry->author;
$app->set_language($author->preferred_language)
if $author && $author->preferred_language;
my $blog = MT::Blog->load($entry->blog_id);
if ($author && $author->email) {
my %head = ( To => $author->email,
From => $app->{cfg}->EmailAddressMain,
Subject =>
'[' . $blog->name . '] ' .
$app->translate("IP Banned Due to Excessive Comments"));
my $charset = $app->{cfg}->MailEncoding || $app->{cfg}->PublishCharset;
$head{'Content-Type'} = qq(text/plain; charset="$charset");
my $body = $app->translate('_THROTTLED_COMMENT_EMAIL',
$blog->name, 10 * $throttle_period,
$user_ip, $user_ip);
$body = wrap_text($body, 72);
MT::Mail->send(\%head, $body);
}
return 0;
}
return 1;
}
投稿者 debizoh : 02:39 | コメント (0) | トラックバック
2006年08月23日
日本語のトラックバックSPAMも結構くるねえ。
SPAM Lookupで排除されている中で誤りがないどうかちょっと確認してみたけれども、全部SPAMだった。
中身的には結構まともに書いていて、アフィリエイトがちょっとしかないというようなサイトもあったので、トラックバック認証しちゃおうかなあ、とか思ったりもしましたが、トラックバック先がトップページってどういうことやねん、という感じなのでやっぱりやめました。送信元が動的IP(DDNSでもなさそう)だったのもあるしね。
アフィリエイトをすることが悪いことではないので、後はサイトとして単にアフィリエイトのためだけじゃなくて自分でやってて意味があるサイトにすればいいのじゃないかなーとか思ったりいたしまする。価格比較サイト大手だって、他社のWebで情報引っ張ってきてっていうのが利用者が大きくなって今の状態になっているだけですしね。モチベーション維持できる内容を書くのが一番なのかなと。
投稿者 debizoh : 01:21 | コメント (0) | トラックバック
あー、昨日のソースちょっと違うなあ
そもそも$throttle_period の間にPingがまた来てると、403 ThrottledになってReturn 0になるから、IP BANのルーチンまで辿りつかんやないですか。
IPBANのところも、そもそもが存在しないobject $entryを叩いているところがあるじゃあないですか。
それと、SPAM的には複数のblogに対してやってくるだろうから(仲間と一緒に使ってるとかの場合ね)、同一のblogに対してという条件も外した方が良いのではないかという。
まあ、そんなこんなでもうちょっとソースのロジック等を改変して、第2弾を作ってみます・・・
投稿者 debizoh : 01:48 | コメント (0) | トラックバック
MovableTypeのTrackBackの処理を変えてみる。多分最終版
MovableTypeのTrackBackの処理を変えてみる。で初版リリースをした上で、
あー、昨日のソースちょっと違うなあ
で、追記をしましたが、大きな問題ではありませんが、ロジック的に納得いかないものなどもありましたので、書き換えました。おそらくこれが最終版・・・だと思います。
Comment.pmの方でも使われていた
$ipban->commit();
は、ipbanのソースにメソッド(オブジェクト?)が存在しないため、そもそもバグです。
今回はこねくり回しているので、結構改変要素が大きいです。
何をするかというと
1.Trackback用のスロットルコントロール秒を指定する。
1~2の追加がそう。
ThrottleSecondsと同様のままでよければ(テストしてないけど)、特に追加はしなくても良い。
一応普通に操作しているユーザを想定するなら長めでいいはず。ただ、大手のblogサービスなんかから大量にpingが来るような場合がもしあるのなら、120(2分)は長いのかもしれない。
2.トラックバックのスロットルコントロール本体の変更
3~4がそう。
A.トラックバックデータ内に、ThrottleSecondsPings秒の間に同一IPからのpingが来たら除外をする。
注意しなければならないのは、pingを除外した場合(Commentでも同じことなんだけれども)その間、そのIPからのデータはトラックバックデータ中に存在しないため、そのままだと、その間だけやり過ごせばpingを送ることが可能になるということ。
エラー用のデータを1つ持っておいて、最後のエラーから+2分というような処理ではない。
エラー用のデータを持たせて、投稿->1分0経過->再投稿->ここから2分待たなければならない という処理が本来はロジック的には理想だけれども、そのような構造で作られていません。
投稿->とにかく投稿...->2分以降で一旦禊が済んだ時点で受け入れがされてしまう。
※そこまで改変すると、次のバージョンアップとかが来た際に大事になると困るのでやれるけどやってません。ま、大きなところではデータを残すことがデータ増加による負荷増ということにもなりますから、この辺りもどう考えるかっていうところですけれどもね。個人的にはいつもそうするので、テストの際面くらいましたけども。あーあー、そうなのね、という感じ.....。
B.更にIPBANのための処理
ThrottleSecondsPings x 10 - 1秒(120と指定していれば、1200秒で20分)の間に4回トラックバックがデータとして残っていれば(ここも、トラックバックがSPAM LookupでSPAMと見なされていようがなんだろうが、「トラックバックデータに残っているものが対象」になることに注意) IPBANの対象とみなし、IPBANを行った上で、ログに残し、メールを送る。20min/4 なので、5分に1回ですから、大手blogサービス等から送られてくる場合のことがちょっと心配ではありますが・・・。
(コメントの場合は、200秒間に8回でBANにするように定義されています。)
ログを残すようにしましたので、動作状況を見ながら変えてみてください。
ま、無駄なもんはばんばんBANしちゃえばいいんじゃないの、と。Proxyほいほいにも使えるかもしれないしね。
ここいらもconfigに分離してもよかったんですけどねえ。
C.その他メモ
コメントは書いておきましたが、
もしも複数のblogをホストしていて、個別のblogに対してのipを排除の条件にしたければ、blog_id => $tb->blog_idのコメントアウトを外してください。
但し、SPAMユーザの行動から考えると、同一のドメインのサブドメイン等に対して並列的にアタックをかけるでしょうから、コメントアウトすべきではないと考えます。
MT3.31Jaでしか試してませんので、他のバージョンではうまく動くかどうかわかりません。
では、ソース等。
その1、その2はがんばって書き換えてください。
その3、その4は、Trackback.pm丸ごとのソースを置いておきます。>これ
その1
mt-config.cgiにThrottleSecondsPings 120
を追加します。
その2
ConfigMgr.pm(lib/MT/ConfigMgr.pm)に以下を追加
['ThrottleSecondsPings', { Default => 20 }],
mt-configで指定せず、ここで、120としても構いません。
その3
TrackBack.pm(lib/MT/App/TrackBack.pm)を書き換える。
_builtin_throttleを前回のように別名にしておいて、以下に書き換える
sub _builtin_throttle {
my ($eh, $app, $tb,$entry) = @_;
my $user_ip = $app->remote_ip;
use MT::Util qw(offset_time_list);
#If ThrottleSeconds is set to Ping, please set it as ConfigMgr.pm.
#Furthermore, if a variable is defined on mt-config.pm, cannot receive Ping from the appointed
# number of seconds, and this IP, and it can be carried out.
my $throttle_period = $app->{cfg}->ThrottleSecondsPings;
my $retcode = 1;
if ($throttle_period eq "" || $throttle_period <= 0)
{
my $throttle_period = $app->{cfg}->ThrottleSeconds;
}
return 1 if ($throttle_period <= 0); # Disabled by ThrottleSeconds 0
# This comment will be meaningless if you have not acted as a host of two or more blog(s).
#
#If it is acting as a host of two or more blog(s) and you want to make ip to individual blog
# into the conditions of exclusion, please remove comment out of blog_id => $tb->blog_id.
#
#However, if it thinks from a SPAM user's action, since an attack will be applied in parallel to
# the sub-domain of the same domain etc., I will think that it should not comment out.
my $eh = shift;
my $app = shift;
my @ts = offset_time_list(time - $throttle_period,
$tb->blog_id);
my $from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
#if Existed TB Ping , Goto Error
if (MT::TBPing->count({ ip => $user_ip,
#blog_id => $tb->blog_id,
created_on => [$from] },
{range => {created_on => 1} })) {
$retcode = 0;
}
else
{
$retcode = 1;
}
@ts = offset_time_list(time - $throttle_period * 10 - 1,
$tb->blog_id);
$from = sprintf("%04d%02d%02d%02d%02d%02d",
$ts[5]+1900, $ts[4]+1, @ts[3,2,1,0]);
my $count = MT::TBPing->count({ ip => $user_ip,
#blog_id => $tb->blog_id,
created_on => [$from], },
{ range => {created_on => 1} });
#It is a case noting that it is Ping which exceeds the appointed number limit of ThrottleSeconds
# seconds from the last track back.
#IPBAN will be performed if the track back is seen off in less than
# [ ThrottleSeconds * 10 second ] more than as for the number of specification.
if ($count >= 4)
{
require MT::IPBanList;
my $ipban = MT::IPBanList->new();
#Please comment out, if IPBAN is set only to the appointed blog.
$ipban->blog_id($tb->blog_id);
$ipban->ip($user_ip);
$ipban->save();
#Bug. There is no method called commit.
#Whether there is any object or there is nothing grasp, and it is solved.
#$ipban->commit();
require MT::Log;
$app->log({
message => "IPBAN " . " IP:" . $app->remote_ip . " banned because Trackback pings rate exceeded 8 comments",
class => 'ping',
category => 'new',
blog_id => $tb->blog_id,
level => MT::Log::INFO(),
metadata => $user_ip,
});
require MT::Mail;
my $author = $entry->author;
#my $author = $tb->author;
$app->set_language($author->preferred_language)
if $author && $author->preferred_language;
my $blog = MT::Blog->load($tb->blog_id);
if ($author && $author->email) {
my %head = ( To => $author->email,
From => $app->{cfg}->EmailAddressMain,
Subject =>
'[' . $blog->name . '] ' .
$app->translate("IP Banned Due to Excessive Trackback pings"));
my $charset = $app->{cfg}->MailEncoding || $app->{cfg}->PublishCharset;
$head{'Content-Type'} = qq(text/plain; charset="$charset");
my $body = $app->translate('_THROTTLED_COMMENT_EMAIL',
$blog->name, 10 * $throttle_period,
$user_ip, $user_ip);
$body = wrap_text($body, 72);
MT::Mail->send(\%head, $body);
}
$retcode = 0;
}
return $retcode;
}
その4
TrackBack.pm(lib/MT/App/TrackBack.pm)を書き換える。
sub ping の_builtin_throttleを呼んでいるとこの直下。
my $passed_filter = MT->run_callbacks('TBPingThrottleFilter',
$app, $tb,$entry);
のように、$entryを追加する。(メールを送信する処理のために追加が必要)
その下。403Throttledが起こった際、ログに記述するための処理を追加する。
if (!$passed_filter) {
my($title, $excerpt, $url, $blog_name, $enc) = map scalar $q->param($_),
qw( title excerpt url blog_name charset);
require MT::Log;
$app->log({
message => "Ping Coming 403 Throttled Occurred." . " IP:" . $app->remote_ip,
class => 'ping',
category => 'new',
blog_id => $tb->blog_id,
level => MT::Log::INFO(),
metadata => $url,
});
return $app->_response(Error => $app->translate("You are pinging trackbacks too quickly. Please try again later."), Code => "403 Throttled");
}
投稿者 debizoh : 05:49 | コメント (0) | トラックバック
2006年08月31日
MT3.32jaが来た。トラックバックの改変など・・・
MovableTypeの「トラックバックのThrottole」関連の処理で、3.31Ja用に改変していましたが、3.32がきたので、修正しなおしてみます。
細かい話は、20060823に書いたものを読んで頂くとして・・・。
ソースの修正位置、内容に関して変更は無くて大丈夫な模様です。ただ、3.32でTrackback関連の修正が入ったので、3.32で改変したTrackback.pmを置いておきます。>これ
おそらく問題はありませんが、Testingということでお願いします。
何か問題があればご連絡などいただければ幸いです。
・・・変わったところだけアップしてくれればいいのに、全部固めてくるからアップグレードも大変やわ。。
投稿者 debizoh : 03:55 | コメント (0) | トラックバック
2006年09月09日
HNStoMovableType
HNSからMovableTypeへ移行させるためのサンプルスクリプト。
以前作って、いつか掲載しますとかいいつつ放置していたのですが掲載しときます。
Windows環境にhnsの日記ファイルをコピーしてきて、
basedirに指定して実行する。
loginuserやblogpass等は、MovableTypeで作成した上で実行。
blogidは、MTを実行させている際に、URLのパラメータ等で表示されているので、
それをメモしておく。
hns2.1.3 MT3.1ぐらいのときに確認。
要Perl5.8以降
Unicode::Japanese
XMLRPC::Lite
jcode.pl(Unicode::Japaneseで全部済むんだけど、作った時はそうしていたので・・・)
細かいことはソース見てがんばってください。HNS->MTのカテゴリマッピングとかもさせなきゃいけないので、細かく設定が必要になってきますので。
ソース
XML-RPCを使ってMTへ投稿をがりがりさせているという感じですので、うまく使えば別の用途にも使えます。(携帯から書き込むとか。画像の処理は別途追加しなきゃなんないけど。)
投稿者 debizoh : 11:36 | コメント (0) | トラックバック
2006年12月15日
SEO対策としてMTPaginateを見直す
SEO対策の観点、アクセス解析という意味においても、動的パラメータはなるべく使うべきではない。
残念ながらMTPaginateは?page=n という形での動的パラメータであるから、そのままではよろしくない。
(だがしかし、どれだけの効果があるかつーと、なんともいえんわけだけれども。)
ということで、改造する。
MTPaginateは「This software is provided as-is and may not be redistributed without permission.」
と書いてあるので、改造して再配布するのは少々難しそうに思われるため、”パッチ”だけ配布します。
ライセンスとして、商用利用なら金払えといったところに関してはオリジナル作成元のライセンスに準じてください。
尚、現在稼動Testing状態でもあるため、何か不具合などあればご報告頂けると幸いです。
余りに長いURIが渡されたら処理しない方がベターなのかもしれない。
適用方法:
Paginate Patch
PaginateをMTPaginate2.pl としてコピーし、パッチを当てる。
以下の変更を行った上、テンプレート側にて<MTPaginate> と記述するところを、<MTPaginate2>に変更する。(閉じタグも)
その他、基本的な使い方はMTPaginateに準ずる。
オリジナルはそのまま残しておくこと。何か問題があれば、MTPaginateとMovableTypeからテンプレートを変更し、Paginateを使っているところだけ再構築すれば済むので安心。
その他変更項目:
尚、index.phpという名前でアーカイブファイルが作成される、ということを規定として入れているため、もし、index.phpでないファイル名にするならば、パッチを適用後、line255の¥$my_scripts = 'index.php'; を、適宜環境に合わせ書き換えること。
また、<$MTPaginateAllPagesLink$>は、、<$MTPaginateAllPagesLink$>=all のようにテンプレートを設定するように解説されているところが多々あるように思われるが、パッチ適用後は、<$MTPaginateAllPagesLink$>のみで問題ない。
尚、page=first、lastといった使用ができるようだが、あまり意味はないので、今パッチ上ではそれらのパラメータは無視されるようになっている。
投稿者 debizoh : 01:40 | コメント (0) | トラックバック
2006年12月20日
SEO対策としてMTPaginateを見直す:バグみっけ
サブカテゴリがあった場合の処理がまずいということに気がつきました。
ちょっと修正かけます。
尚、サブカテゴリーの無い環境であれば、以前のままで問題ありません。
取り急ぎごほうこく、と。
投稿者 debizoh : 07:49 | コメント (0) | トラックバック
2006年12月21日
SEO対策としてMTPaginateを見直す:たぶん最終版
SEO対策としてMTPaginateを見直すで、最初に出しましたが、おそらく今回が最終版です。
SEO対策の観点、アクセス解析という意味においても、動的パラメータはなるべく使うべきではない。
残念ながらMTPaginateは?page=n という形での動的パラメータであるから、そのままではよろしくない。
(だがしかし、どれだけの効果があるかつーと、なんともいえんわけだけれども。)
ということで、改造する。
MTPaginateは「This software is provided as-is and may not be redistributed without permission.」
と書いてあるので、改造して再配布するのは少々難しそうに思われるため、”パッチ”だけ配布します。
ライセンスとして、商用利用なら金払えといったところに関してはオリジナル作成元のライセンスに準じてください。
適用方法:
パッチソース:Paginate Patch1.01
PaginateをMTPaginate2.pl としてコピーし、パッチを当てる。
以下の変更を行った上、テンプレート側にて<MTPaginate> と記述するところを、<MTPaginate2>に変更する。(閉じタグも)
その他、基本的な使い方はMTPaginateに準ずる。
オリジナルはそのまま残しておくこと。何か問題があれば、MTPaginateとMovableTypeからテンプレートを変更し、Paginateを使っているところだけ再構築すれば済むので安心。
その他変更項目:
ver1.01:
BUG:1.0でURI上にindex.php(自身のファイル名)が含まれない場合に問題があった。
CHANGES:
アーカイブページで使われることを想定しています。それ以外での動作はたぶんしません。
尚、カテゴリアーカイブページでのみ動作確認をしています。
自身のページがフォームタイプではないため、フォームでの埋め込みでは確認していません。
$pathinfo_maxlength = 50;
という記述が追加されています。PATH_INFOを使うように変えましたが、PATH_INFOで長い文字列を与えられた場合の処理を変更するためのものです。index.php/page/? となるため、pathinfoが長くなることは到底考えられませんが、一応50文字としています。
前回のでURIからの取得はまずいかもしれない、ということを書きましたが、
ソースにも書いておいてありますけれども、
For example
http://some.url.com/archives/cat2/index.php//////page/3
Umm.... It is also in such cases....
http://some.url.com/archives//cat2/index.php/////page/3
http://some.url.com///archives///cat2/index.php//////page/3
というのも通じてしまいます。
※長いとブラウザで横が広がってしまうので、ちょっと短くしています。
(PATH_INFO的には/がいくつあっても減ってENVに入るのですが)
ですので、URIパラメータから動的に処理をさせるというのは、/を何個も渡してリソースを食わせる(大した処理負荷でもありませんけども)ことができるため、ちょっとまずいな、というところでした。
そのため、
MT::Template::Context::_hdlr_archive_link にて、アーカイブページそのもののURLが取得できるため、それを内部で埋め込むようにしました。(それがわかって修正が完了するまで、カテゴリページがうまくみれなくてすみません・・・)
ver1.01で廃止
pagename(前回で、index.phpと埋め込んでいたもの)は MT::Template::Context::_hdlr_archive_linkでURLが取得できるため変数定義は必要なくなりました。
ver1.0から変更なし
<$MTPaginateAllPagesLink$>は、、<$MTPaginateAllPagesLink$>=all のようにテンプレートを設定するように解説されているところが多々あるように思われるが、パッチ適用後は、<$MTPaginateAllPagesLink$>のみで問題ない。
尚、page=first、lastといった使用ができるようだが、あまり意味はないので、今パッチ上ではそれらのパラメータは無視されるようになっている。
