割と有名なお話かもしれませんがブラウザで、スラッシュがないアドレスで要求した場合のお話。
パターンA
http://hogehoge.jp を要求した場合
(正しい表記は http://hogehoge.jp/ )
ブラウザが勝手に補完してくれる?
パターンB
http://hogehoge.jp/hoge を要求した場合
(正しい表記は http://hogehoge.jp/hoge/ )
http://hogehoge.jp/hoge というファイルを探しに行く
↓
hoge というファイルは存在しない
本来ならば apache は 404 Not Found を返すが、
hoge というディレクトリならば存在することがわかったので
301 Moved Permanently を返す
(mod_dir の機能)
↓
このドキュメントは http://hogehoge.jp/hoge/ に移動しました
という形で Location を指定した返事を返す※1
↓
ブラウザが / を補完した http://hgehoge.jp/hoge/ という形でアクセス
↓
表示
※1
具体的には以下のような動作
言うまでもなくアドレスなどなど架空なものに差し替えてあります
% telnet hogehoge.jp 80
Trying 192.168.100.100...
Connected to hogehoge.jp.
Escape character is '^]'.
GET http://hogehoge.jp/hoge HTTP/1.0
HTTP/1.1 301 Moved Permanently
Date: Wed, 22 Aug 2007 06:05:35 GMT
Server: Apache/1.3.37 (Unix)
Location: http://hogehoge.jp/hoge/
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>301 Moved Permanently</TITLE>
</HEAD><BODY>
<H1>Moved Permanently</H1>
The document has moved <A HREF="http://hogehoge.jp/hoge/">here</A>.<P>
</BODY></HTML>
Connection to hogehoge.jp closed by foreign host.
ということで、http://hogehoge.jp/hoge/ を表示してくれるわけです。
この場合、httpd.ocnf の ServerName に指定してある値を Location で設定してくれるらしい。
とまあここまでは一般的なお話。
今回は続きがありますです。
それは Virtualhost を使った場合。
ServerName hogehoge.jp
<VirtualHost>
ServerName hogehoge2.jp
DocumentRoot /home/hogehoge2.jp
</VirtualHost>
<VirtualHost>
ServerName hogehoge3.jp
DocumentRoot /home/hogehoge3.jp
</VirtualHost>
としてあった場合、
http://hogehoge.jp/hoge にアクセスをすると
http://hogehoge2.jp/hoge/ が返ってくる。
さっきの例でいうと
% telnet hogehoge.jp 80
Trying 192.168.100.100...
Connected to hogehoge.jp.
Escape character is '^]'.
GET http://hogehoge.jp/hoge HTTP/1.0
HTTP/1.1 301 Moved Permanently
Date: Wed, 22 Aug 2007 06:05:35 GMT
Server: Apache/1.3.37 (Unix)
Location: http://hogehoge2.jp/hoge/
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>301 Moved Permanently</TITLE>
</HEAD><BODY>
<H1>Moved Permanently</H1>
The document has moved <A HREF="http://hogehoge2.jp/hoge/">here</A>.<P>
</BODY></HTML>
Connection to hogehoge.jp closed by foreign host.
こういうことになるわけです。
回避策として
<VirtualHost>
ServerName hogehoge.jp
DocumentRoot /home/hogehoge.jp
</VirtualHost>
<VirtualHost>
ServerName hogehoge2.jp
DocumentRoot /home/hogehoge2.jp
</VirtualHost>
<VirtualHost>
ServerName hogehoge3.jp
DocumentRoot /home/hogehoge3.jp
</VirtualHost>
と記述を追加しました。動作はOKです。それぞれのものがきちんと返ります。
VirtualHost 設定した時点で読み込むところが変わるのでせうか。
マニュアル読んだりと内容確認中。
