このサーバの OS を FreeBSD 4.4-RELEASE-p9 から、 4.4-RELEASE-p11 に更新したついでに、HTTP サーバソフトを、 Apache 1.3.24 から Apache 2.0.35 に更新しました。 まあ、 いずれ今後職場のサーバも Apache 1.3 ベースから Apache 2.0 ベースに移行すると思われるので、 このサーバで経験を積んでおくのもよかろう、ということで、 思いきって一気に何も考えずに更新しました (このタイミングに当たった人、ごめんなさい)。 結果…、はまった (^^;。
(まあ、このサーバの管理の経験は、 後々いろいろ職場で役に立ったりしているんですよね…)
もっともビビッたのは、 charset 情報を HTTP レベルで入れることが必須になっている点です。 このサイト、iso-8859-1, euc-jp, iso-2022-jp, shift_jis のコーディングのファイルが、いろいろな場所に散らばっているため、 参った参った。
とりあえず、.htaccess で次のように指定して、 手動でディレクトリ単位でコードを指定しました。 これが正しい対処かどうかは分からないですが、 とりあえずこれで対処しました (1997 年の日記が iso-2022-jp で記述されていたので、 これは残りと同じ euc-jp に統一しました)。
AddType "text/html; charset=euc-jp" .html
どうなんでしょう? MultiViews 辺りで対処するのが正しいのか、 システムワイドのデフォルトで対処するのが正しいのか、 httpd.conf の AddCharset で次みたいにして、 ファイル名の方を変えるのが正しいのか… (これって、 私の趣味サイト程度ならどうでもいいんだけど、 結構職場で Windows 系とかを考えると大変なんだけどな〜、 あ、WebDAV 使ったりするとどうなるのかな?)。
AddCharset EUC-JP .euc-jp
次にはまったのは CGI。 CGI は、httpd.conf の、
AddHandler cgi-script .cgi
で指定するんだけど、 charset に関しては、CGI スクリプト自体が出力する HTTP ヘッダで、
print <<EOF; Content-type: text/html; charset=euc-jp EOF
みたいに出力しない限り、 Apache2 は iso-8859-1 を仮定してくれるみたいです。 単に Content-Type: text/html だけ描いておくと、 Apache2 は勝手に charset=ISO-8859-1 を補ってくれるのです。 こんな感じにね。
% telnet fromto.cc 80 Trying 203.141.151.140... Connected to fromto.cc. Escape character is '^]'. GET /hosokawa/diary/search/namazu.cgi HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 22 Apr 2002 18:02:19 GMT Server: Apache/2.0.35 (Unix) DAV/2 Connection: close Content-Type: text/html; charset=ISO-8859-1
まあ、Perl のスクリプトだったら、単にヘッダ出力部を書き換えるだけですむけど、 問題は C で書いてあるスクリプトです。
たとえば namazu2 は、ports でソースを展開→FreeBSD パッチの適用の後、 手動で Content-Type を吐き出すところを全て、 charset=euc-jp 付きで出力するようにパッチを当ててコンパイルしました。 この結果、文字化けはなくなりましたが、 このパッチを ports/database/namazu2 に commit していいかというと、 そんなはずもありません。 本質的解決は namazu2 の Apache2 対応リリースを待つ他ないのかな? それとも私のやり方が大間違い?
それはともかく、Apache2 では、 mod_ssl も mod_dav も最初から Apache 標準になっていてびっくり。 他にも面白そうな機能がいろいろあるから、 試してみようかな。