Home > 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ライセンスっぽいんですが、ソースは公開した方がいいんですかね?
誰か解る方 コメントをお願いします。

このエントリーを含むはてなブックマークはてなブックマーク - 「今日のリンク元」の問題対処 この記事をクリップ!Livedoorクリップ - 「今日のリンク元」の問題対処 BuzzurlにブックマークBuzzurlにブックマーク FC2ブックマークへ追加 Bookmark this on Delicious Digg This

Comments:0

Comment Form
Remember personal info

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

Home > MovableType > 「今日のリンク元」の問題対処

BlogPeople
RSS Feed
メタ情報

Return to page top