ここ1ヶ月、某会社のシステム構築の仕事の依頼を受け、せっせと組み上げておりました。
「頑丈な造りを」ということで、脱Windows、自動バックアップ付きの仕様です。
1台の機器にてRAID 構成にするよりは、2台の機器(うち、1台は既存機器)を使って、LANを通して自動バックアップ構成をとったほうが安価で機能的にもほぼ同等で確実な構成に出来るのですが、この点、頑なに理解しない技術屋も結構居ます。
先日、新規サーバ1台とセットで設置しに行ったわけですが、現場でサーバ上で稼動させるデータベースに自動バックアップの構成を構築した後にデータを投入し、GUIインタフェースとなるWebブラウザのため
のサーバ Apache 2.2(現行は 2.2.25) をサービス開始するわけですが、不可解な現象に数時間悩む・・・
通常、
のように、表示されるわけですが、何故か
のように、CGIが吐き出すHTMLをテキストでそのまんま出してしまう。。
要するに text/plain で表示されてしまうわけです。
何をやっても駄目で、どういうわけか IE8 ではきちんとページが表示されるが、手元の Firefox と Chrome は text/plain モードな表示です。
現場で数時間悩んだものの、とりあえず IE8 で簡単な説明をして(IE8 ではまともに表示しないので、アップデートをお願いしておいた)、現場を引き上げ、その後から仕事場でプロトコル解析です。
ほどなく原因が判りました。通常、CGIからHTMLなページを表示させるには、
Content-type: text/html; charset=utf-8
といったヘッダ行を(標準出力へ)最初に出し、更に(標準出力へ)空の行を1行出して、本体との区別を行い、そこからHTML本体を(標準出力へ)流し込む形を取ります。このヘッダ行に問題があって、
4637Content-type:
みたいな状態になっていました。問題の部分はここ
# HTMLヘッダ出力
sub out_header {
my ($mimetype,$hstr) = @_ ;
print $hstr if ($hstr ne "") ;
print "Content-type: $mimetype\n\n" ;
}
これを呼び出すところで、
out_header('text/html; charset=utf-8',length($outstr),undef) ;
のようになっていたわけです。
($outstr には、HTML ページ本体を文字列の形で格納している。length はその長さを返す)
構築作業中、Apache 2.4 上で制作していたためか、このような現象には一切遭遇せず、納品サーバで動作確認していなかったのが原因ですが、レベルの低いところで悩みまくっていましたorz
・この現象は、Apache 2.2.x で発生し、 Apacxhe 2.4.x では発生しないようです。
・Apache 2.4.x では、CGIが出すヘッダが狂っていても、本体部分をチェックして適切なヘッダに書き換えるようです。
・Apache 2.2.x でも、ブラウザが IE8 では発生せず、HTMLなページが表示されます。しかし、IE9 以降では、text/plain な表示になります。
・IE8 では、不明ヘッダは text/html として処理するが、IE9 以降や Firefox,Chrome においては、text/plain の処理となるようです。