- 2006-02-06 (月) 22:58
- MovableType
tDiaryにある今日のリンク元をMovableTypeでもできるようにするCGIがあります。
私も結構前から設置していて、有用に使わせてもらっていました。
これの設置方法にはSSIとJavascriptを使用する方法があります。
Javascriptモードだとブラウザの設定でJavascriptを動作させないように設定しているとリンク元が取得できません。
なんだこのやろう生意気なやつだなってことで、SSIを使って確実に動かしたいわけですが…
LolipopはsuexecとかいうApacheのセキュリティモードがうんたらかんたら…
まぁ つまりはサーバの設定のせいで、SSIを動かすためにちょいと縛りがあります。
それは 何かというと…
SSIを使用したいHTMLがあるディレクトリ以下にSSI用CGIを置きたまえ。
というような すんばらしいセキュリティポリシー。
たとえば、SSI用CGIをいくつかのファイルから読み込ませたい場合などにめんどくさいことが起こります。
例:
/abc/[SSI用CGI]
/abc/blog/2005/01/[SSI-CGIを動かしたいHTML1]
/abc/blog/2005/02/[SSI-CGIを動かしたいHTML2]
という構成の場合、これでは動きません。
なぜかっつーと、
SSI用CGIが動かしたいファイルより上の階層にあるから。
じゃあ…ということで
/abc/blog/2005/01/[SSI-CGIを動かしたいHTML1]
/abc/blog/2005/01/[SSI用CGI]
/abc/blog/2005/02/[SSI-CGIを動かしたいHTML2]
/abc/blog/2005/02/[SSI用CGI]
と馬鹿なことをすると超冗長なわけですな…
あともう一つ、今日のリンク元CGIをJavascriptモードで動かした場合、リファーに+だとかスペースが入っているとうまく動作してくれないことがあったりして、これの対処もしようとおもいます。
前置きが長くなりましたが、これを解決するための小細工が以下です。
細かい設定自体は本家の方を見ていただくとして、対処の所のみを書いておきます。
対処方針は
PHPを使ってリファーをとり、CGI内部ではJavascriptのルートにつっこむ
という荒技をとります。
まぁ Perl歴1年(ブランク3年)、PHP歴3時間の私の対処ですので、あまり参考にはならないかもしれません。
識者のつっこみ 歓迎します。
まず 今日のリンク元CGIを置く場所を確認します。
ここでは
/abc/ref_read.cgi
/abc/ref_write.cgi
で、ブラウザからは
http://example.com/abc/ref_read.cgi
http://example.com/abc/ref_write.cgi
で見える、としておきますかね。
MTのテンプレート上での設定
まずリンク元を書き込んでくれる ref_write.cgi くんを
<MTEntries lastn="1">
<?php
$referer=urlencode( getenv("HTTP_REFERER") );
$url=’http://example.com/abc/ref_write.cgi?<$MTEntryID$>+’ . $referer;
include $url;
?>
</MTEntries>
こんな感じでインデックスと各エントリで設定。
http://からのフルパスを指定しPHPで取り込むことにより SSI の呪縛を逃れ、URLエンコードしたリファーを渡すことにより、+だとかスペースが入っているリファーも無問題にする訳ですな。
私 偉い!(ぉ
同様に ref_read.cgi さんも
<?php include "http://example.com/abc/ref_read.cgi?<$MTEntryID$>+COUNT"; ?>
という感じでインデックスと各エントリに設定。
CGI本体の方ですが、 ref_read.cgi は
$MODE= ‘ssiinclude’;
としておけば、動いてます。いいのか悪いのかは謎です。
ref_write.cgi はちょっと手を加えます。
「phpinclude」という新たな$MODEを作ります。
$MODE = ‘phpinclude’;
Line58からelsif文の分岐を修正
} elsif ($MODE eq "javascript"){
#JavaScript
$filename=@ARGV[0];
$filename =~ s/\..*//;
$remote=@ARGV[1];
}
となっているのを
} elsif ($MODE eq "javascript" || $MODE eq "phpinclude" ){
#JavaScript
$envq=$ENV{‘QUERY_STRING’};
@envq = split(/\+/, $envq);
$filename = @envq[0];
$filename =~ s/\..*//;
$remote = @envq[1];
$remote =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
}
とします。
もらった引数を分解してリファーの部分はURLデコードしてあげるわけですな。
・ここでちょっと注意書き。
split関数を使って引数を分解しているところがあるんですが、これは別の方がやっていた対処の一部です。
ソースを失念してしまってどなただったか解らないのですが、解る方がいらっしゃいましたらお教えくださいませ。
Line176 if文を修正
if($MODE eq "ssiinclude"){
を
if($MODE eq "ssiinclude" || $MODE eq "phpinclude"){
とする。
こんな感じで うまく動いています。
ところで、今日のリンク元CGIはGNUライセンスっぽいんですが、ソースは公開した方がいいんですかね?
誰か解る方 コメントをお願いします。
- Newer: エントリの投稿日を公開日に自動変更する
- Older: MT3に移行
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.eternalmiracle.net/taka/archives/2006/02/06-225857/trackback
- Listed below are links to weblogs that reference
- 「今日のリンク元」の問題対処 from eternal miracle blog mode

