私が遊びで携帯電話向けに作ったサイトでトラブルがあったので、携帯電話の問題かと思ったら、私のバグだったと気づく出来事が今日ありました。
情けない話なのですが、バグの現れ方がツボにはまって笑っちゃうくらいなので、サイトのトラブル解決は泥臭い話だという実例として。
プログラムできない人にはわかりにくい話ですが、ご容赦を。
特定のページを Vodafone 902T で表示させたら、 白い背景に次のような文字だけが表示されるトラブルが起きました。
エラーが発生しました。リクエストが不正です。(WJ46053E)
端末やネットワークのトラブルもあるかもと思っていましたが、試しに PC のブラウザで表示させたらページが真っ白になり、慌てて Apache HTTP Server のログを見たら HTTP のステータスコードが記録されていませんでした。となるとサイトのトラブルです。
トラブルの原因は PHP プログラムの次の1行。
header('HTTP/1.1 Not Modified');
これは全くの凡ミスなので、修正しました。
header('HTTP/1.1 304 Not Modified');
「304」を書き加えただけですが、それが大事です。その後は PC のブラウザでも Vodafone 902T でも、トラブルは起きなくなりました。
ツボの一つ目は、大変なトラブルに見えて、実は凡ミスで1行間違えただけだった(間違えると致命的な1行なのですが)こと。
ツボの二つ目は、端末でページの再読込を行ったときはトラブルが発生しないこと。
上記の行は、Vodafone 902T や PC のブラウザが「前にこの URL のコンテンツを取得したときは 200X年X月XX日 XX時XX分XX秒 に更新されたと聞いたけど、それから更新されていなければ '304 Not Modified' とだけ答えて。更新されていれば '200 OK' の返答とコンテンツの内容を送って」と要求したときにサイトが「304 Not Modified」と答える部分です。
端末で再読込を行ったときは、端末は(古いか新しいかは関係ないとあきらめた上で)「この URL のコンテンツを送って」という(先ほどの例とは違う)要求をして、サイトは単純にコンテンツの内容を送ります。プログラムの問題の部分は使われていませんでした。
私が、単純にコンテンツの内容を送り続ければトラブルは減るところを、パケットを減らそうと細工をしたら、詰めのところで失敗しました。
ユーザから見ると、そのページを2回以上見たときにトラブルが起きて、再読込するとトラブルが消えます。前に読めたページが読めなくなって、再読込すると読めるようになると、端末が不安定になったように見えますが、技術的にはサイトのバグなんです。
しかもサイト管理者自身 -つまり私- がユーザと同じように勘違いしているわけです。
馬鹿としか言いようがないのですが、ウェブサイトのトラブルの原因は直すまで分からないものだと、嫌というほど分かりました。
追記 2007-08-16
エラーコード WJ46065E の情報を探して、このエントリをご覧の方へ。
このバグで出したエラーコードは WJ46065E ではありません。数字の下二桁が違うことにお気づきと思います。
おそらくエラーコードには個別の意味があり、WJ46065E のトラブルは HTTP ステータスコードが欠けたからではないと想像します。
※コメント投稿者のブログIDはブログ作成者のみに通知されます