frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

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書いてやりゃいいだけなんで(^^;