この文書は Apache がリクエストの URL から送信するファイルの ファイルシステム上の位置を決定する方法を説明します。
リクエストに対してどのファイルを送信するかを決定するときの
Apache のデフォルトの動作は、リクエストの URL-Path (URL のホスト名と
ポート番号の後に続く部分) を取り出して設定ファイルで指定されている
Apache にはサーバが複数のホストへのリクエストを受け取る
バーチャルホスト の機能もあります。
この場合、それぞれのバーチャルホストに対して違う
ファイルシステム上の、
厳密には FollowSymLinks
か SymLinksIfOwnerMatch
が
ある場合にのみシンボリックリンクをたどります。
代わりの方法として、
という設定のときは、URL
http://www.example.com/docs/dir/file.html
には
/var/web/dir/file.html
が送信されます。
もっと柔軟な設定が必要な状況では、
は http://example.com/~user/cgi-bin/script.cgi
への
リクエストを /home/user/cgi-bin/script.cgi
というパスへ
マップし、このマップの結果としてのファイルを CGI スクリプトとして
扱います。
伝統的に Unix システムではユーザ user のホームディレクトリを
~user/
として参照できます。
セキュリティの観点から、ウェブからユーザのホームディレクトリへ
直接アクセスできるようにすることは適切ではありません。ですから、
Userdir public_html
を使うと、上の URL は
/home/user/public_html/file.html
というようなファイルに
マップされます。ここで、/home/user/
は
/etc/passwd
で指定されているユーザのホームディレクトリです。
/etc/passwd
にホームディレクトリの位置が書かれていない
システムでも使うことのできる他の形式もあります。
中にはシンボル "~" (%7e
のように符号化されることが多い)
を格好が悪いと思って、ユーザのディレクトリを表すために別の文字列の
使用を好む人がいます。mod_userdir はこの機能をサポートしていません。
しかし、ユーザのホームディレクトリが規則的な構成のときは、
http://www.example.com/upages/user/file.html
が
/home/user/public_html/file.html
にマップされるようにするには、
以下のように AliasMatch
ディレクティブを使います:
上の節で説明した設定用のディレクティブは Apache に
ファイルシステムの特定の場所からコンテンツを取ってきて
クライアントに送り返すようにします。ときには、その代わりに
クライアントにリクエストされたコンテンツは別の URL にあることを
知らせて、クライアントが新しい URL へ新しいリクエストを行なうように
する方が望ましいことがあります。これはリダイレクションと
呼ばれていて、/foo/
が新しいディレクトリ /bar/
に移動したときは、
以下のようにしてクライアントが新しい場所のコンテンツをリクエストするように
指示することができます:
これは、/foo/
で始まるすべての URL-Path を、
www.example.com
サーバの /bar/
が
/foo/
に置換されたものにリダイレクトします。
サーバは自分自身のサーバだけでなく、どのサーバにでもクライアントを
リダイレクトすることができます。
Apache はより複雑な書き換えの問題のために、
あるいは、一時的にサイトのすべてのページを他のサイトの特定の ページへリダイレクトするときは、以下を使います:
Apache は遠隔地にあるドキュメントをローカルのサーバの URL 空間に 持ってくることもできます。この手法はリバースプロキシと呼ばれています。 ウェブサーバが遠隔地のドキュメントを取得してクライアントに送り返すのが プロキシサーバの動作のように見えるからです。クライアントにはドキュメントが リバースプロキシサーバから送られてきているように見える点が通常の プロキシとは異なります。
次の例では、クライアントが /foo/
ディレクトリの下にある
ドキュメントをリクエストすると、サーバが internal.example.com
の
/bar/
ディレクトリから取得して、さもローカルサーバからの
ドキュメントのようにしてクライアントに返します。
internal.example.com
からのリダイレクトがローカルサーバの
適切なディレクトリを指すように書き換えます。
同様に
ただし、ドキュメントの中のリンクは書き換えられない、
ということは知っておいてください。
ですから、internal.example.com
への絶対パスによるリンクでは、
クライアントがプロキシサーバを抜け出して internal.example.com
に
直接リクエストを送る、ということになります。
サードパーティ製モジュールの mod_proxy_html
は、HTML と XHTML 中のリンクを書き換えることができます。
より一層強力な置換が必要なときは、
必ず、リクエストされた URL に対応するファイルがファイルシステムに 無いという場合が発生します。これが起こるのにはいくつかの理由があります。 場合によっては、ドキュメントを別の場所に移動した結果であることがあります。 この場合は、クライアントにリソースの新しい位置を知らせるために URL リダイレクションを使うのが最善の方法です。 そうすることによって、リソースは新しい位置に移動しているけれども、 古いブックマークやリンクが動作し続けるようにすることができます。
"File Not Found" エラーのもう一つのよくある理由は、
ブラウザへの直接入力や HTML リンクからの偶発的な URL の入力間違いです。
Apache はこの問題を改善するために、
mod_speling の非常に有用な機能は、大文字小文字を区別せずに ファイル名を比較するものです。これは URL と unix の ファイルシステムが両方とも大文字小文字を区別するものである、 ということをユーザが知らないシステムで役に立ちます。ただし、 時折の URL 訂正程度で済まず、mod_speling をより多く使用すると、サーバに さらなる負荷がかかります。すべての「正しくない」リクエストの後に URL のリダイレクトとクライアントからの新しいリクエストがくることに なりますから。
コンテンツの位置を決めようとするすべての試みが失敗すると、
Apache は、HTTP ステータスコード 404 (file not found) と共に
エラーページを返します。このエラーページの外観は