«Vine Linux 2.6r4 に VineSeed .. メイン Vine Linux 2.6r4 に WebObjects..»

日々是横着

全文検索:% grep '' *.td2

アンテナでの更新チェックには、antenna.lirs か、index.rdf をご利用ください。


[tdiary] xrea で tDiary を正常に動かす方法(まとめ)

Last updated: 2008-08-18T07:11:48

xrea で CGI が Script Error になるのは Last-Modified ヘッダのせい

tDiary に限らず、xrea では Last-Modified ヘッダを出力する CGI は全て、かなりの頻度で「Script Error」が出てしまうようです。

例えば、以下のような非常に単純なスクリプトでもエラーします。

#!/usr/local/bin/ruby

print <<EOF
Content-type:text/html
Last-Modified: Mon, 01 Dec 2003 00:00:00 GMT

<html>
<body>
test
</body>
</html>
EOF

ruby のところを perl に変更しても同様です。

つまりこれは、tDiary 固有の問題でもなければ、ruby 固有の問題でもなく、 xrea のサーバ側(apache?)の「問題」というか「仕様」というか、、、なわけです。

実はこの現象、お金を払ってない、つまり広告が自動挿入されるユーザでは 起きず、お金を払って広告が挿入されないようになっているユーザだけに 起きる現象のようです。

回避策その1: Last-Modified ヘッダの出力を諦める

Last-Modified ヘッダさえ出力しなければ正しく動くようなので、 最も簡単な対処方法は Last-Modified ヘッダの出力を諦めて、 Last-Modifiled の出力をしている箇所をコメントアウトすることです。

tDiary で言えば、index.rb に

head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )

という行が 1 行ありますので、これの頭に「#」を付けてコメントアウト します。

#head['Last-Modified'] = CGI::rfc1123_date( tdiary.last_modified )

但し、Last-Modified ヘッダが出力されないと、アンテナや更新チェッカに よる更新のチェックに支障をきたします。そういう場合は、

などを動くように設定し、これらによって出力される index.rdf や antenna.lirs などのファイルを更新チェックの対象にしてもらう、という 手があります。

回避策その2: NPH CGI スクリプトを使う

tDiary では上記のようなプラグインを利用すれば簡単に 更新チェックができますが、自分で CGI を組む場合や どこかから拾ってきた CGI を利用する場合はそう簡単に代替手段が 利用できない場合もあり、やはり

Last-Modified ヘッダを出力しつつ正常にスクリプトを動かしたい

という場合もあるでしょう。

そもそもお金を払ってないユーザには起きず、 お金を払っているのにこういう制限を強いられるというのは納得がいきません。

というわけで、サポートに問い合わせてみたところ、 NPH(Non Parsed Header) CGI スクリプトという形式で動かしてはどうか ということを教えて頂きました。

私はこの時初めて nph というものを聞いたので、あまりよくわかって いませんが、とにかくファイル名の頭に nph- をつけると NPH CGI スクリプトとして動いてくれるようです(CGI の仕様?)。

で、この NPH CGI スクリプトというのは、名前の通り、 CGI スクリプトが出力する HTTP ヘッダを apache がパースしたり 書き換えたりせずにそのまま出力するスクリプトのようです。

NPH CGI スクリプトを使うことによる問題

普段(nph じゃないとき)、apache は、 CGI が出力するヘッダに 対して何をしているのかというと、例えば、

  • サーバの情報
  • サーバの時刻の情報
  • レスポンス情報(404 Not Found とか)

などを付加して出力してくれているわけです。

つまり、nph CGI スクリプトにしてしまうと、apache はこれらの情報 を出力してくれなくなります。

もしこれらの表示されなくなる情報の中にブラウザが必要とする情報が 含まれていると、nph にしたところで結局その CGI プログラムは 正しく表示されなくなります。

実際、tDiary も単純に nph- を頭に付けるだけでは正しく表示されず、 tDiary の出力結果の HTML ソースがそのまま表示されてしまいました。

スクリプトを NPH 対応にする

いろいろ試した結果、どうやら nph スクリプトでは

HTTP/1.1 200 OK

というようなレスポンス情報が apache から出力されないのが 問題だとわかりました。

というわけで、これをヘッダに出力するようにスクリプトを 以下のように変更してやるという手が思い付きます。

print "HTTP/1.1 200 OK\n"

しかし、ruby の CGI ライブラリには nph の対応がちゃんと盛りこまれてお り、自分でこんなことをしなくてもヘッダ情報に

'nph' => true

という情報を追加してやるだけで、 nph に対応したヘッダを出力して くれるようになるようです。

まとめ

というわけで、以上をまとめて、xrea で tDiary を動かすためには 以下のような変更をしてやる必要があります。

ファイル名の変更

これは単純に mv するだけです。

mv index.rb nph-index.rb

もちろん、コマンド操作になれていない人は 先にローカルで名前を変更してから FTP でアップロードするなり、 FTP ソフト上でリネームしても良いでしょう。

update.rb というスクリプトもありますが、こちらは元々 Last-Modified ヘッダが出力されないようになっているので、 こちらについては何もする必要はありません。

.htaccess の変更

通常のインストールでは

DirectoryIndex index.rb

という記述をしていると思いますが、これを

DirectoryIndex nph-index.rb

に変更します。

これで、

http://tmaeda.s45.xrea.com/td/nph-index.rb

ではなく

http://tmaeda.s45.xrea.com/td/

とアクセスすれば、自動的に

http://tmaeda.s45.xrea.com/td/nph-index.rb

にアクセスしたことになります。

また、html_anchor プラグイン を使っている人は RewriteRule を以下のように書いていると思いますが、

RewriteRule ^([0-9]+)\.html$ index.rb?date=$1

これを以下のように書き換える必要があります。

RewriteRule ^([0-9]+)\.html$ nph-index.rb?date=$1

tDiary のソースを nph 版に修正

(nph-)index.rb に、 ヘッダの出力の設定をしている箇所が 2 箇所ほどありますので、 これに

'nph' => true,

を追加するだけで nph 対応のヘッダになります(ruby の cgi.rb の機能)。

head = {
'type' => 'text/html',
'Vary' => 'User-Agent'
}

head = {
  'nph' => true,        # 追加
  'type' => 'text/html',
  'Vary' => 'User-Agent'
}

に変更。

さらに、ズズィッと下の方までいって、

rescue TDiary::ForceRedirect
  head = {
    #'Location' => $!.path
    'type' => 'text/html',
  }

rescue TDiary::ForceRedirect
  head = {
    #'Location' => $!.path
    'nph' => true,       # 追加
    'type' => 'text/html',
  }

に変更。

update.rb の方は何も変更する必要はありません。

以上で、Last-Modified ヘッダを出力しつつ、 xrea で tDiary (や、その他の CGI) を正常に動かすことができるようになります。

コメント(19) [コメントを投稿する]
_ 久遠 2004/09/14-22:01:12

Internal Server Errorと出てしまいます。
パーミッション設定はちゃんと700にしてるのに何処が行けないのかわかりませんですorz

_ tmaeda 2004/09/15-01:39:50

htaccess の
AddHandler cgi-script .rb

AddHandler cgi-script-debug .rb
に書き換えて実行すると、エラーなどが表示されると思いますけど、、、

Internal Server Error というのは大抵スクリプトが間違っているのが原因
ですから、スクリプトの書き換えのところで何かタイプミスを
してないかとか、設定ファイルを書くところでタイプミスをしてないかとか、
文字コードがあってるかとか、FTP でのアップロードの手順に間違いがないか
とかを確認されるとよいでしょう。

_ tmaeda 2004/10/06-13:38:03

コメントスパム対策テスト

_ 初心者 2005/07/12-07:53:16

Internal Server Errorが出る方は
'nph' => true,       # 追加
丸ごとコピーしてたりすると上の所が原因かも
'nph' => true,
だけにするといいです

_ rvdczwong jugbvln 2007/09/27-22:49:14

koym kgcolavf opdshzg cnluep mxctw qyewnph xvphkbwrn

_ t_issie 2008/02/27-23:59:02

こちらの情報をもとにs47にtDiary version 2.2.0を設置できました。ありがとうございます。トラックバックも正常に動作しているようです。

_ lexapro 2008/04/10-20:55:09

Article Opinion <a 

_ ephedrine 2008/04/10-20:55:09

Article Opinion <a 

_ viagra 2008/04/10-20:55:10

Article Opinion <a 

_ ambien 2008/04/10-20:55:10

Article Opinion <a 

_ xenical 2008/04/10-20:55:17

Article Opinion <a 

_ lexapro 2008/04/10-20:55:21

Article Opinion <a 

_ xenical 2008/04/10-20:55:31

Article Opinion <a 

_ ephedrine 2008/06/20-09:05:14

Article Opinion <a 

_ viagra 2008/06/20-09:05:21

Article Opinion <a 

_ ambien 2008/06/20-09:05:23

Article Opinion <a 

_ lexapro 2008/06/20-09:06:12

Article Opinion <a 

_ xenical 2008/06/20-09:06:14

Article Opinion <a 

_ Kazelovw 2008/08/18-07:11:48

Hi webmaster!


編集