Linux サーバ構築 ( Fedora Core5 ) - WEBサーバ
apache2 - 4.エラーメッセージ表示の仕組み
apache2 のエラーメッセージの表示の基本的な仕組みです。コンテントネゴシエーションおよび SSI により各国語のエラーメッセージ表示にも対応しています。
apache2 では、次のような仕組みでエラーメッセージが表示されます。(デフォルトの設定の場合)
- httpd.conf における エラー・フォルダの設定
/etc/httpd/conf/httpd.conf ( 抜粋 )
Alias /error/ "/var/www/error/" <IfModule mod_negotiation.c> <IfModule mod_include.c> <Directory "/var/www/error"> AllowOverride None # SSI は許可するが exec 機能(shell によるコマンド実行)は許可しないようにする Options IncludesNoExec # このフォルダのすべての html ファイルを SSI で処理する AddOutputFilter Includes html # 拡張子 var のファイルを type-map ハンドラにマップする AddHandler type-map var Order allow,deny Allow from all LanguagePriority en es de fr ForceLanguagePriority Prefer Fallback </Directory> # エラードキュメントの指定 # ErrorDocument (error-code) (error-document) 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 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var </IfModule> </IfModule>
- コンテントネゴシエーション ( モジュール mod_negotiation )
下記の例のように、タイプマップ( type-map ハンドラで扱われるファイル)から、条件ヘッダ( Content-language および Content-type )に合致した Body ヘッダが選択され、実際の本文として読み込まれます。
/var/www/error/HTTP_NOT_FOUND.html.var( 抜粋 )
(省略) Content-language: itイタリア語の場合 Content-type: text/html; charset=ISO-8859-1 Body:----------it-- (省略) -->----------it-- Content-language: ja日本語の場合 Content-type: text/html; charset=ISO-2022-JPコードセット JIS Body:----------ja-- この区切り文字から (省略) ----------ja-- この区切り文字までの間がリソースの実際の本文となる (省略)
- SSI(Server Side Includes) ( モジュール mod_include 他 )
下記の SSI ディレクティブ(青色表示)により、動的に生成されたコンテンツを現在の HTML ページに加えます。
尚、日本語の部分は、実際にはコードセット JIS(ISO-2022-JP)により記述されています。
エラーメッセージの外観を決める html には、共通のヘッダとフッタが include により、読み込まれます。/var/www/error/HTTP_NOT_FOUND.html.var ( 上記 日本語の場合を抜粋 )
Content-language: ja Content-type: text/html; charset=ISO-2022-JP Body:----------ja-- <!--#set var="CONTENT_LANGUAGE" value="ja" --><!--#set var="CHARACTER_ENCODING" value="iso-2022-jp" --><!--#set var="TITLE" value="Object not found!" --><!--#include virtual="include/top.html" -->共通の ヘッダ・ファイル 要求された URL は本サーバでは見つかりませんでした。 <!--#if expr="$HTTP_REFERER" --> <a href="<!--#echo encoding="url" var="HTTP_REFERER"-->"> 参照元ページ</a>のリンクが間違っているか、古くなってしまっているようです。 <a href="<!--#echo encoding="url" var="HTTP_REFERER"-->" >ページ</a>の著者にこのエラーをお知らせ下さい。 <!--#else --> もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。 <!--#endif --> <!--#include virtual="include/bottom.html" -->共通の フッタ・ファイル ----------ja--
- 共通の ヘッダ・ファイル
青色表示は SSI ディレクティブです。
/var/www/error/include/top.html
<!--#if expr="! $CONTENT_LANGUAGE" --><!--#set var="CONTENT_LANGUAGE" value="en" --><!--#endif --><!--#if expr="! $CHARACTER_ENCODING" --><!--#set var="CHARACTER_ENCODING" value="ISO-8859-1" --><!--#endif --><?xml version="1.0" encoding="<!--#echo var="CHARACTER_ENCODING" -->"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="<!--#echo var="CONTENT_LANGUAGE" -->" xml:lang="<!--#echo var="CONTENT_LANGUAGE" -->"> <head> <title><!--#echo encoding="none" var="TITLE" --></title> <link rev="made" href="mailto:<!--#echo encoding="url" var="SERVER_ADMIN" -->" /> <style type="text/css"><!--/*--><![CDATA[/*><!--*/ body { color: #000000; background-color: #FFFFFF; } a:link { color: #0000CC; } p, address {margin-left: 3em;} span {font-size: smaller;} /*]]>*/--></style> </head> <body> <h1><!--#echo encoding="none" var="TITLE" --></h1> <p>
- 共通の フッタ・ファイル
/var/www/error/include/bottom.html
</p> <p> <!--#include virtual="../contact.html.var" --> </p> <h2>Error <!--#echo encoding="none" var="REDIRECT_STATUS" --></h2> <address> <a href="/"><!--#echo encoding="entity" var="SERVER_NAME" --></a><br /> <span><!--#echo var="SERVER_SOFTWARE" --></span> </address> </body> </html>
( 最終更新日時 : 2008/08/31 21:24:48 )