●多分難しくないApache2:その2(普通のWebサーバらしい動作へ)
※私のblog「ぴろにっき」からの転記(+追記&修正)ノートです。
 「その1」までの設定内容で、「それとなく雰囲気的にはWebサーバとして振る舞っているような気がする設定」までは完了したものの、ひいき目に見ても「まだまだ足りない子」であることが否めない。 「その1」の設定内容を実践してもらった人にはツッコミどころが判っていると思うのだけども、
足りない点その1: http://(server名)/ でアクセスすると「ファイルが無い」とかエラーになる。 http://(server名)/index.html といちいち「index.html」とかファイル名まで指定しなければならない
足りない点その2: ブラウザによっては日本語の文字がどの「エンコード」を指定しても化け化けになることがある。(賢いブラウザだと普通に表示される)
足りない点その3: バイナリファイルを直接ダウンロードするとファイルがなぜか壊れてしまう(賢いブラウザだと以下略)
 …Webサーバとしては致命傷なんじゃなかろうか?(苦笑) これもひとえに「httpd.confの設定がまだ足りないから」に他ならない。ここでは、これらの問題を解決していきたいと思う。

1:ファイル名を省略したら、当然「index.html」でしょ!常識的に考えて。 例えば、http://(server名)/ とか、 http://(server名)/directory/ でアクセスをしたら、そのサーバのドキュメントルート、あるいはその下にあるディレクトリに置いてあるindex.htmlファイルに自動的にアクセスをするのが世間一般的なWebサーバとしては常識的な振る舞いじゃないでしょうか。(まあ、場合によってはindex.cgiとかindex.phpとかindex.plとかindex.rbとか以下略) そこで、現在調ky(マテ 設定中のWebサーバにもそのような設定を導入する事にしましょう。
 ここで登場するディレクティブが「DirectoryIndex」というディレクティブ。ファイル名の指定を省略した場合、このディレクティブで指定したファイルが使用されるという寸法。 index.htmlを使用したいという場合、
-----DirectoryIndex     index.html-----
 …と、これだけ書いておけば完了だったりする。 なお、このディレクティブには複数のファイルを指定することができる。例えば
① index.cgi があればそれを使用する↓② 無ければindex.htmlを使用する
 というような場合は、
-----DirectoryIndex     index.cgi index.html-----
 というような記述をすると、目的を達成できる。 ちなみに、現時点ではこのディレクティブを記述するとドキュメントルート以下の全てのディレクトリでこの設定が適用される。「Directory」ディレクティブと組み合わせることによって、「特定のディレクトリ」以下では違うファイルを使わせることも出来る。
 例えば、
① 普通は、「index.html」を使用する↓② /var/www/html/windows ディレクトリ以下では「main.htm」を使用したい
 というような場合は…
=====DirectoryIndex     index.html
<Directory     "/var/www/html/windows">    DirectoryIndex     main.htm</Directory>=====
 と、書けばよいことに。

2:文字コードを正しく認識させる 本来は、htmlファイルの中で「meta」タグを使用するなどして、そのファイルの中の文字コードが何であるかを指定しなければなりません。ところが、お行儀の悪い人だとか、htmlファイルでは無くただのテキストファイルを配信したい場合等はそのファイルの中身がどのような文字コードで書かれているのか、判らない場合があります。 こうなってくると、次はブラウザの「賢さ」にかかってくる訳ですが、時と場合によってはサーバ側で
 「文字コードの明示的な指定が無い場合はコレコレの文字コードだと思ってください!」
 と、指定することで問題を回避出来る可能性があります。 よくあるのが、PCでブラウザを使用してWebサーバにアクセスしていて、それをLinuxサーバ上で作成したファイルを見せたい場合とかです。 PC側で多く期待している文字コードとしてはShift-JISだったり、場合によってはUTF-8だったりするでしょう。サーバ側だとUTF-8か、EUC-JPだったりする可能性があるでしょう。
 このような場合はサーバ側で「AddDefaultCharset」ディレクティブを使用します。
 なお、本来ここで推奨される設定は
=====AddDefaultCharset     Off=====
 です。あくまでもhtmlファイルの中で文字コードをきちんと指定すべきなのです。そしてサーバとしてはその内容には関知しませんよ…というべきなのですが、必ずしもそうは言えないような場合についてだけ、指定を変更します。 例えばUTF-8ですよ~と言いたい場合は
=====AddDefaultCharset     utf-8=====
 と、記述しておきます。

3:ファイルの「種類」を正しく認識させる Webサーバが扱っているファイルの形式が何であるか?という問題は重要な問題です。これによってクライアントの振る舞いを指定することができ、またクライアント側でも、ブラウザ自身がそのファイルを扱えない場合、どんなソフトを起動すれば良いか?という選択を正しくすることが出来るようになります。
 例えば、Adobe社オリジナルのファイル形式である「pdf」ファイルをWeb上で公開したいとしよう。 この時、pdfファイルへのリンクをクリックした時、サイトによって2通りの動作をすることが有ることに気がつかないだろうか?
動作その1:ブラウザの画面上にpdfファイルの中身が表示される動作その2:pdfファイルがPCのハードディスク上にダウンロードされてくる
 同じブラウザを使用していて、このような違いが現れることがある。 これは、サーバ側で指定している「MIME(マイム)タイプ」という情報に違いがあるからだったりする。 「動作その1」をするWebサイトの場合、Webサーバ側が「このファイルはpdfというファイルです」ということを知っていて、そしてそれをクライアント側に通知している。だから、クライアント側は「pdfというファイルなら、このアプリケーション(プラグイン)を使用すればいい」という判断が付くわけです。 ところが、「動作その2」をするWebサイトの場合、Webサーバ側は「pdfというファイル」のことを知らない(MIMEタイプの情報を持っていない)場合が多く、サーバ側からは、「このファイルは単なるバイナリファイルです」という情報をクライアント側に通知している。だから、(真正直な)クライアントは単なるバイナリファイルならダウンロードして保存しておけばいいかな?  と、認識してしまい、同じpdfファイルでもファイルが表示されずにダウンロードされてしまう。
 賢い(?)ブラウザの場合、サーバからMIMEタイプが通知されない場合、あるいはおかしな情報が通知された場合に「ほどよく脳内補完」をして「より適切な」振る舞いをしてくれる場合もあるようですが、RFCに律儀に従うブラウザの場合は、あらゆるファイルが表示されずにダウンロードされてしまってWebサイトのデザインもへったくれもないという状態に追い込まれてしまったりします。(笑)
 そこで、「どういうファイルが、どんなMIMEタイプか」という設定をするのですが、世の中には星の数ほどのファイルの種類が存在しているので、これをいちいち書いていたらWebサーバの管理者はみんなきっと過労死してしまうに違い有りません。 この苦労をIANAという団体が買って出てくれていますので、我々もこれをありがたく利用させていただくのがラクチンで良いです。(笑)
 ここで使用するディレクティブは2つあります。
 「TypesConfig」ディレクティブと、「MimeMagicFile」ディレクティブの2つです。 なお、両方指定しても構いませんが、どちらか一方は指定すべきでしょう。
 どのような違いがあるのか?と言うと…
○ TypesConfigディレクティブの場合 → ファイルの「拡張子」からファイルのMIMEタイプを決定します
○ MimeMagicFileディレクティブの場合 → ファイルの「中身」からファイルのMIMEタイプを決定します
 『常識的な』ファイルの使い方をしているのなら、「TypesConfig」ディレクティブで十分です。「MimeMagicFile」ディレクティブが必要になるのは、「ファイルの中身と拡張子が一致しない」とか、「そもそも拡張子が付いていない」とか、CGI側でMIMEタイプを全く指定していないか、またはデタラメである…というような、非常にひねくれた使い方をしている場合に限られると思ってもらって差し支えないと思います。(笑)
 …というわけで、どちらを使うべきか、自ずと答えが出てきますね?(笑)
 なお、TypesConfigもMimeMagicFileも、ディレクティブに続けて「ファイルの情報を定義したファイル」を指定します。TypesConfigで使用するファイルは、通常はOS側が管理しているので、それを利用します。(ありがたやありがたや~)MimeMagicFileはApacheのソースコードをメンテナンスしている人達が管理してくれていますので、それを利用します。(ありがたやありがたや~)
 具体的な記述は…
=====TypesConfig       /etc/mime.typesMimeMagicFile     conf/magic=====
 という具合になります。両方書いてもいいし、「普通は」TypesConfigだけあれば十分なのでそれだけでも構いません。
#注意# MimeMagicFileディレクティブを使用すると、ファイルのMIMEタイプを特定するため、Webサーバが『いちいち』そのファイルの内容を点検することになるので、サーバ負荷が…とか、クライアントからのレスポンスが…とかいうような問題にかち合う可能性が出てくるので気をつけましょう。
 では、ここまでのhttpd.confの記述内容全体を確認してみましょう。 MIMEタイプの設定については、TypesConfigのみを使用している例とします。
 …と、いきたいところですが、この他に例の「モジュール」の追加も必要になります。「DirectoryIndex」ディレクティブの追加のためと、MIMEタイプの追加のために必要です。
-----LoadModule dir_module   modules/mod_dir.soLoadModule mime_module   modules/mod_mime.soLoadModule mime_magic_module   modules/mod_mime_magic.so-----
 MimeMagicFileディレクティブを使用する場合は、上記の「1行目と3行目」が必要で(2行目は必要ありません)、TypesConfigディレクティブを使用してMimeMagicFileディレクティブを使用しない場合は、「上の2行」だけが必要です。(3行目は必要有りません)
-----LoadModule authz_host_module      modules/mod_authz_host.soLoadModule authz_default_module   modules/mod_authz_default.soLoadModule dir_module   modules/mod_dir.soLoadModule mime_module   modules/mod_mime.so
ServerRoot      "/etc/httpd"PidFile         "run/httpd.pid"Listen          80User            apacheGroup           apache
ServerName      "kagami.hiiragi.com:80"DocumentRoot    "/var/www/html"
<Directory      "/">        Order   Allow,Deny        Deny from       All</Directory>
<Directory      "/var/www/html">        Order   Deny,Allow        Allow from      All</Directory>
<Files  ~       ".ht">        Order   Allow,Deny        Deny from       All</Files>
DirectoryIndex     index.htmlAddDefaultCharset     OffTypesConfig       /etc/mime.types-----
 こんな感じで~♪ これで、「ひとまず」Webサーバとしての基本動作…は、確保できているはず。(笑)
 でも、これではまだサーバを外部公開できる水準にはありませんからね。せいぜい、「家庭内ネットワーク」とか「社内ネットワーク」とかいった、ネットワークとしてセキュアな環境でサーバを公開するに留めておくべきです。
 次は「認証のかかったページ」を提供する方法を解説する予定です。
 …が、その前に、「外部への公開に耐えうる」ために最低限必要となる残りの設定項目について補足説明のノートを挟んでおきたいと思います。