404 Not Found。
とあるスクリプトで、アタックをされた時などに
意図的に 404 ステータスを返すように仕掛けてあった。
が、これだけだと、ヘッダー部は、まぁ、いいんだけど、
IE以外が真っ白な画面になってしまう、との事。
HTTP/1.x 404 Not Found
Date: Sat, 08 Nov 2008 13:06:41 GMT
Server: Apache
Keep-Alive: timeout=5, max=10
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain
へぇー。本当だ。これじゃ、本当の404エラーと同じ振る舞いじゃないじゃん。
仕方ないので、隣の席の同僚さんで、すごいプログラマーさんにお聞きしたら
print "HTTP 1.1 404 Not Found\n\n"; って書いてみたらとアドバイスをいただいた。おぉ。
かくして、早速試してみるも…惜しいっ。
Not Found
The requested URL /test/404.cgi was not found on this server.
Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Apache/1.3.36 Server at anigon.net Port 80
apache のエラーログ見ても、勿論、こっそりエラーが出てる次第。
ざんねーん。
で、要はエラー文言どおりに httpd.conf とかに ErrorDocument が設定されてないから
「あのー、何を表示したら、よかですか?」って apache が困ってる様子なんだけど、
今までカスタマイズしたヤツを設定してなかった訳だから、標準のを出してくれりゃ嬉しいんですが。
あの標準のHTMLって、何処にあるんかわからない…orz。
あのー、apache のコンパイルされちゃってる、なんか内部に入ってるんですかねー。
ちなみに、apache インストール直後の httpd.conf には
「/var/www/error/ ディレクトリ配下のファイルで、国際化対応出来るんで
その下の HTTP_NOT_FOUND.html.var を、ErrorDocument の設定先にしたらどうでしょう?」
的なコメントが入ってるんだけど。
「設定先にしたらどうでしょう?」という提案であって、標準がそれではないので、
試しに、HTTP_NOT_FOUND.html.var を加工して、存在しないファイルのURLを叩いたけど
やっぱり、ErrorDocument で指定しない限り、HTTP_NOT_FOUND.html.var は表示されない次第。
うーん、どこだ。
どこにあるんだ、標準のは。
てな訳で、apache をダウンロードしてきて、コンパイル前のソースから検索してみたら
案の定、みっけた。
・apache_1.3.41/src/main/http_protocol.c
3045行目:
case NOT_FOUND:
ap_rvputs(r, "The requested URL ",
ap_escape_html(r->pool, r->uri),
" was not found on this server.
\n", NULL);
3004行目で「switch (status) {」が始まってて
status が NOT_FOUND なら、例の標準のエラーを表示するようです。
ついでに status に NOT_FOUND つっこんでる箇所も探したんだけど
結構探すのが大変なので、中断しました(^^;
ちなみに NOT_FOUND は、apache_1.3.41/src/include/httpd.c ん中で定義してて
先ず「#define HTTP_NOT_FOUND 404」やっといて
「#define NOT_FOUND HTTP_NOT_FOUND」と設定してました。へー。
んで、エラーログに吐かれる「File does not exist: xxx」の部分は
apache_1.3.41/src/main/http_core.c の default_handler の 4140行目で
ap_log_rerror 呼び出して記録してて
そのタイミングで HTTP_NOT_FOUND を返してましたが、
これが上記の status にどう流れて入るんだかは、追えてないっす。すまん。
そんなこったで、結局、標準のHTMLを偽装する事にしました(笑)
404ステータスの後に、すました顔して Content-type: text/html で
Not Found のHTML書いてやりゃいいだけなんで(^^;