こんにちは。

Yukihiro Matsumoto wrote on the <1066400910.062715.3606.nullmailer / picachu.netlab.jp>
>うーん、mod_rubyはそもそもCGI 100%互換じゃないですからねえ。
>完全互換にできない以上、mod_rubyでも動かしたいなら出力に気を
>つけろというのは許される範囲の制限だと私は思います。

そうですね。いきなり嵌りそうな点はこの辺でしょうか。

●標準出力への出力はすべてmessage-bodyとなる

CGIでは次のようにヘッダに続けてbodyを出力するように書きますが、
mod_rubyではすべてmessage-bodyとして扱われます。

print "Content-Type: text/html\n\n"
print "foo\n"

上記のスクリプトは、mod_rubyでは、Content-Typeの行も表示されます。

FAQにはNPH-CGIのように動作すると書かれていますが、実際にはそのようには
なっていませんよね?

●標準出力への出力は、$stdoutを使う

標準出力オブジェクトを明示的に指定する場合は、STDOUTではなく、
$stdoutを使わなければなりません。

●ヘッダの出力は、send_http_headerメソッドを使う

ヘッダを出力するには、次のようにheaders_outなどに値を指定して、
send_http_headerを呼び出します。

Apache.request.content_type = "text/html"
Apache.request.headers_out["foo"] = "bar"
Apache.request.send_http_header()

CGI#headerを使えば、CGIとmod_rubyの両方で動くように書けます。headerメ
ソッドは、CGIではヘッダ文字列を返しますが、mod_rubyではヘッダを出力し
ます。そのため、headerメソッドの戻り値を利用するようなスクリプトは修正
しなければなりません。

cgi = CGI.new
print cgi.header()  # mod_rubyでは標準出力には何も出力されない
print "foo\n"

-- 
HORIKAWA Hisashi (in Kanji: 堀川 久)
Netsphere Laboratories  http://www.nslabs.jp/