www.suzu841.com | mrs.suzu841.com

neko1sa.gif httpd.conf error responses のカスタマイズ

webサイトでいつも見るエラーメッセージ。
ごくごくシンプルで非常にそっけないものが多いのですが、自分のサイトに合わせてカスタマイズをできないものか?と
今回はローカルの httpd.conf をほんの少しだけいじってみました。

今回使用した環境は、以下のものです。
OS : centOS 5.1
Apache 2.2


httpd.conf

httpd.conf はCentOS 5.1 では、 /etc/httpd/conf/ の中にあり、Apache web server の設定ファイルです。
以下は CentOS 5.1 のデフォルトの Apache の httpd.conf のサンプルです。



httpd.conf は大きく分けると3つのブロックから成り立っています。

Section 1: Global Environment ← 全体設定
Section 2: 'Main' server configuration ← メインサーバの設定
Section 3: Virtual Hosts ← バーチャルホストの設定

今回はこの中の Section 2: 'Main' server configuration にある error responses のカスタマイズになります。
上の httpd.conf のサンプルでは811行目あたりからの文字列になります。


error メッセージのファイルを作る


難しく考える必要はありません。自分のサイト用のエラーメッセージが表示される html ファイルを作ればいいのです。
一番よく目にするのが「 404 NOT FOUND 」ではないでしょうか?
こんなサンプルを作ってみました。

ごくごく簡単に見てくれもへったくれもありませんが、上のソースコードです。


作るときに注意したほうがいいのが、イメージ画像などを挿入したりすると、設定がややこしくなったり、うまく反映されなかったりしますので、なるべくシンプルにテキストだけで html を作ったほうがいいと思われます。
( serverが名前解決できる必要性から画像を使う時などには、 httpで始まる絶対的パスでの指定が必要です。)

それから、スタイルシートなどを使用するときには、なるべくコンテンツの中へ埋め込んだほうが簡単です。
通常、私たちは大きな規模のものを作る必要は考えられませんので、なるべく簡単に、且つ、確実にエラーメッセージが表示されるようなものを作った方がいいと思います。

そこでちょっと気になるのが、英文を訳さなければいけないのか? ということですが、
以下に簡単な一覧を用意してみました。

BAD GATEWAY  502 プロクシサーバは上流サーバから不正な応答を受信しました
BAD REQUEST 400 お使いのブラウザ (またはプロクシ) が、サーバの理解できないリクエストを送信しました。
FORBIDDEN  403 アクセス権限がないか、、サーバが読み込みに失敗したかと思われます。
GONE  410 要求された URL は既に本サーバでは利用できなくなっています。
INTERNAL SERVER ERROR 500 サーバ内部で障害が発生し、 リクエストに応えることができませんでした。
LENGTH REQUIRED 411 このメソッドのリクエストでは、正しい ヘッダが必要になります。
METHOD NOT ALLOWED 405 このメソッドは、要求された URL に対しては許可されていません。
NOT FOUND 404 要求された URL は本サーバでは見つかりませんでした。
NOT IMPLEMENTED 501 ブラウザの要求したアクションは、サポートしていません。
PRECONDITION FAILED 412 指定された URL へのリクエストにおける事前条件が満たされませんでした。
REQUEST ENTITY TOO LARGE 413 メソッドがデータの送信を許可していないか、データ量が許容量を超えています。
REQUEST TIME OUT 408 ブラウザが指定時間以内にリクエストを完了しませんでした。
REQUEST URI TOO LARGE 414 リクエストの URL の長さが、扱える長さを超えています。処理の続行は不可能です。
SERVICE UNAVAILABLE 503 メンテナンスで停止中か、サーバの処理能力の問題のため、現在リクエストに応じる事ができません。後ほど再度お試し下さい。
UNAUTHORIZED 401 URL へのアクセス権限があることを確認できませんでした。ユーザ ID とパスワードを再確認して下さい。
UNSUPPORTED MEDIA TYPE 415 リクエストで指定されたメディアタイプはサポートされていません。
VARIANT ALSO VARIES 506 そのバージョンの HTTP リクエストは、server が対応していないためにタイムアウトが発生しました。





置き場所

作成したエラーメッセージを例えば「 error_1 」とでも名前をつけたディレクトリーの中へ入れて、
私の環境である CentOS 5.1 では、「 /var/www/ 」以下に置きます。
この置き場所は RedHat 系のものですし、他のディストリビューションや、OS 、環境などによっては変化しますので、このまま適用できるかどうかは、ご自分の環境と照らし合わせてくださいますように。
また、同じ CentOS 5.1 でも、ソースからコンパイルした環境では別の path になります。

それから、一番上の httpd.conf のサンプルで732行目あたりの
LanguagePriority で始まるところの列にある「 ja 」の文字を「 en 」の前へ持ってきたりするとサーバの負荷を少しは軽減できるかもしれません。

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl -------

下のように変更します

LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl --------


Alias の設定

さて、いよいよ httpd.conf をいじります。
上の httpd.conf のサンプルでは837行目から始まります。
Alias /error/ "/var/www/error/"
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory "/var/www/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>

# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
# ErrorDocument 410 /error/HTTP_GONE.html.var
# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

</IfModule>
</IfModule>

まず、緑色の文字( # , .var )は削除します。
「 # 」はコメントアウトの記号ですから、これをはずさないとこの設定行は生きてこないことになります。
また、「 .var 」は拡張子ですから新しく作ったものの拡張子が「 .html 」であるならば、「 .var 」は変更しなければなりません。
Unix ( Linux )系では、いわゆるWindowsでいうところの拡張子がいくつ重なっても、ファイルシステムの違いにより、OK です。他には圧縮ファイルの「 .tar.gz 」などもそうですよネ?

赤い文字列の「 error 」は、ディレクトリーの名前ですから、作成した html を入れたディレクトリーの名前に変更します。
例えば、ここでは、「 error_1 」としてありますので、その名前に変更することになります。

Alias /error/ "/var/www/error_1/"
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory "/var/www/error_1">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>

ErrorDocument 400 /error_1/HTTP_BAD_REQUEST.html
ErrorDocument 401 /error_1/HTTP_UNAUTHORIZED.html
ErrorDocument 403 /error_1/HTTP_FORBIDDEN.html
ErrorDocument 404 /error_1/HTTP_NOT_FOUND.html
ErrorDocument 405 /error_1/HTTP_METHOD_NOT_ALLOWED.html
ErrorDocument 408 /error_1/HTTP_REQUEST_TIME_OUT.html
ErrorDocument 410 /error_1/HTTP_GONE.html

以下同様にします。

</IfModule>
</IfModule>

設定は以上で終わりです。
これで間違いなく表示されるかどうか、わざとブラウザ上で、表示されることのないページ名を入力してみましょう。


私の場合はこんな感じで表示されましたが・・・・?


ここでは、別ディレクトリーを作って分けましたが、もとのディレクトリーである「 error 」の中へ入れてもいいと思います。同じ名前のファイルでも、拡張子が違いますから、上書きにはなりません。その時には上の httpd.conf の設定はディレクトリーの名前を変更する必要はないわけで、ファイル名が同じであれば、拡張子( .var )の変更だけをすればいいことになります。

拡張子が「 .var 」と「 .html 」が同一のディレクトリーにある場合、 Apache はどちらを読み込むのか?
という疑問が出てきますが、おそらく「 .html 」の方が優先されるのではないかと思います。
また、ここでは日本語文しか作成しませんでしたが、では他の国の人が見にきたらどうなるのか?
というと、それは Apache 自身が持っているデフォルトのごくごく味気ない各国のエラーメッセージが表示されることになります。


おまけ - XAMPP for Windows

Windows で XAMPP を利用して検証環境として同じようなことを行う方法です。

OS 環境 : Windows XP sp2
XAMPP 1.6.6a : Apache 2.2

条件は上と同じように「 error_1 」というフォルダー内にカスタマイズ用の .html ファイルを作成してあるものとして、XAMPP の直下にある xampp\apache\conf\extra の中の「 httpd-multilang-errordoc.conf 」の設定をします。

以下はデフォルトの「 httpd-multilang-errordoc.conf 」のサンプルです。



例えば、 XAMPP は「 O(オー) 」のドライブにインストールしてあるものとします。
すると XAMPP の path は 「 O:\XAMPP 」ということになり、その直下にある apache の ServerRoot path は
「 O:\XAMPP\apache\ 」ということになります。
さらに、自分のコンテンツを置いてある DocumentRoot を「 htdocs 」とした場合は、「 O:\XAMPP\htdocs\ 」が DocumentRoot の path になります。
以上のことを踏まえて Windows XP_sp2 環境での検証環境を作っていきたいと思います。


上の「 httpd-multilang-errordoc.conf 」のサンプルの22行目より設定をします。

Alias /error/ "O:/xampp/apache/error_1/"

<Directory "O:/xampp/apache/error_1">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority ja en cs de es fr it ko nl pl pt-br ro sv tr
ForceLanguagePriority Prefer Fallback
</Directory>

ErrorDocument 400 /error_1/HTTP_BAD_REQUEST.html
ErrorDocument 401 /error_1/HTTP_UNAUTHORIZED.html
ErrorDocument 403 /error_1/HTTP_FORBIDDEN.html
ErrorDocument 404 /error_1/HTTP_NOT_FOUND.html
ErrorDocument 405 /error_1/HTTP_METHOD_NOT_ALLOWED.html
ErrorDocument 408 /error_1/HTTP_REQUEST_TIME_OUT.html
ErrorDocument 410 /error_1/HTTP_GONE.html
ErrorDocument 411 /error_1/HTTP_LENGTH_REQUIRED.html
ErrorDocument 412 /error_1/HTTP_PRECONDITION_FAILED.html
ErrorDocument 413 /error_1/HTTP_REQUEST_ENTITY_TOO_LARGE.html
ErrorDocument 414 /error_1/HTTP_REQUEST_URI_TOO_LARGE.html
ErrorDocument 415 /error_1/HTTP_UNSUPPORTED_MEDIA_TYPE.html
ErrorDocument 500 /error_1/HTTP_INTERNAL_SERVER_ERROR.html
ErrorDocument 501 /error_1/HTTP_NOT_IMPLEMENTED.html
ErrorDocument 502 /error_1/HTTP_BAD_GATEWAY.html
ErrorDocument 503 /error_1/HTTP_SERVICE_UNAVAILABLE.html
ErrorDocument 506 /error_1/HTTP_VARIANT_ALSO_VARIES.html

「 # 」と「 .var 」の拡張子は削除します。「 error 」と言う名前のところは新しく作ったファイルが入っている「 error_1 」というフォルダー名に変更します。

実際に作成したファイルを入れたディレクトリーは、ここでは例として、自分のコンテンツを置く場所を「 htdocs 」としましたので、 DocumentRoot の「 O:\XAMPP\htdocs\ 」以下に置く事になります。
ここを間違えると表示される事はなくなってしまいます。
apache の ServerRootである「 O:/xampp/apache/ 」ではありませんので、ご注意下さい。

LanguagePriority で移動した「 ja 」は、サーバの負荷を軽減させるためのものですので、これは設定しても、しなくてもいいことになりますが、もし、自分のサーバがもう、アップアップの状態で、少しでも負荷を軽くしたいと思うなら、設定してください。ほんのわずかでも負荷を軽減させることができます。


※ ここで設定したものはあくまでもローカルでの検証用として説明しております。 このままの設定で実際に web に公開することはとても危険なことだと言うことをご理解願います。