設定用セクションコンテナの種類
core
mod_version
mod_proxy
Directory
DirectoryMatch
Files
FilesMatch
IfDefine
IfModule
IfVersion
Location
LocationMatch
Proxy
ProxyMatch
VirtualHost
コンテナには二つの基本となる種類があります。ほとんどのコンテナは
各リクエストに対して評価されます。その場合、コンテナ中のディレクティブは
コンテナにマッチするリクエストにのみ適用されます。一方、
IfDefine,
IfModule,
IfVersion
コンテナは
サーバの起動時と再起動時にのみ評価されます。起動時に条件が真であれば、
コンテナ中のディレクティブはすべてのリクエストに適用されます。条件が
偽であれば、コンテナ中のディレクティブは無視されます。
IfDefine ディレクティブは
httpd コマンドラインで適切なパラメータが定義されたときにのみ
適用されるディレクティブを囲います。例えば次の設定では、サーバが
httpd -DClosedForNow
を使って起動されたときだけすべての
リクエストを別のサイトにリダイレクトします:
<IfDefine ClosedForNow>
Redirect / http://otherserver.example.com/
</IfDefine>
IfModule は
非常に似ていますが、代わりにサーバ上でモジュールが使用可能な場合にのみ
適用可能なディレクティブを囲います。モジュールはサーバに
静的に組み込まれているか、動的に組み込むようになっていて、設定ファイル中で
LoadModule の行がより前の
部分に書かれている必要があります。このディレクティブは特定のモジュールの
存在に関わらず設定ファイルが動作する必要がある場合にのみ使ってください。
常に動作して欲しいディレクティブを囲むために使うべきではありません。
存在しないモジュールに関する有用なエラーメッセージの発生を抑制してしまいますので。
次の例では、mod_mime_magic があるときにのみ MimeMagicFiles ディレクティブが
適用されます。
<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>
IfVersion
ディレクティブは
IfDefine や
IfModuleと、
とてもよく似ていますが、稼働中のサーバのバージョンが特定のバージョンの時にのみ
適用されます。様々なバージョンの httpd を様々な設定で動作させることになる場合で、
テストスイートや巨大なネットワークでの用途を想定して、
このモジュールは設計されています。
<IfVersion >= 2.1>
# this happens only in versions greater or
# equal 2.1.0.
</IfVersion>
IfDefine,
IfModule,
IfVersion ディレクティブは
テストの前に "!" を付けることで否定の条件を適用することができます。
また、これらのセクションはより複雑な制限を課すために入れ子にすることができます。
ファイルシステムとウェブ空間
最もよく使われる設定のセクションコンテナはファイルシステムやウェブ空間の
特定の場所の設定を変更するものです。まず、この二つの違いを理解することが
大切です。ファイルシステムはオペレーティングシステムから見たディスクの内容です。
たとえば、デフォルトのインストールでは Apache は Unix ファイルシステムでは
/usr/local/apache2
に、Windows ファイルシステムでは
"c:/Program Files/Apache Group/Apache2"
に存在します。
(Apache では Windows でもパスセパレータとしてスラッシュを使うことに
気をつけてください。) 対照的に、ウェブ空間はあなたのサイトを
ウェブサーバから配信されるものとして見たもので、クライアントに見えるものです。
デフォルトの Unix 上の Apache のインストールではウェブ空間の
/dir/
というパスはファイルシステムの
/usr/local/apache2/htdocs/dir/
というパスに対応します。
ウェブページはデータベースや他の場所から動的に生成することもできますので、
ウェブ空間はファイルシステムに直接マップする必要はありません。
ファイルシステムコンテナ
Directory ディレクティブと
Files ディレクティブ、それと
それらの正規表現版はディレクティブをファイルシステムの一部分に対して適用します。
Directory セクションの
中のディレクティブは指定されたディレクトリとそのすべてのサブディレクトリに
適用されます。.htaccess ファイルを
使うことでも同じ効果を得ることができます。例えば、次の設定では
/var/web/dir1
とすべてのサブディレクトリに対して
ディレクトリインデックスを行ないます。
<Directory /var/web/dir1>
Options +Indexes
</Directory>
Files セクションの
中にあるディレクティブはどのディレクトリにあるかに関わらず、指定された名前の
すべてのファイルに適用されます。ですから例えば以下の設定ディレクティブが
設定ファイルの主セクションに書かれたときには、すべての場所の
private.html
という名前のファイルへのアクセスを拒否します。
<Files private.html>
Order allow,deny
Deny from all
</Files>
ファイルシステムの特定の場所にあるファイルを指定するために、
Files セクションと
Directory セクションを
組み合わせることができます。例えば、次の設定では
/var/web/dir1/private.html
,
/var/web/dir1/subdir2/private.html
,
/var/web/dir1/subdir3/private.html
など、
/var/web/dir1/
ディレクトリの下にあるすべての
private.html
へのアクセスを拒否します。
<Directory /var/web/dir1>
<Files private.html>
Order allow,deny
Deny from all
</Files>
</Directory>
ウェブ空間コンテナ
一方、Location
ディレクティブとその正規表現版は
ウェブ空間上の内容に対して設定を変更します。
たとえば、次の設定では /private で始まる URL パスへのアクセスを制限します。
具体的には、
http://yoursite.example.com/private
,
http://yoursite.example.com/private123
,
http://yoursite.example.com/private/dir/file.html
へのリクエストや、
他の同様に /private
文字列で始まるリクエストに
適用されます。
<Location /private>
Order Allow,Deny
Deny from all
</Location>
Location
ディレクティブはファイルシステムと関係ある必要が全くありません。
たとえば次の例では、どのようにして特定の URL を
mod_statusで提供されている Apache
内部ハンドラにマップするかを示しています。ファイルシステムに
server-status
というファイルが存在する必要はありません。
<Location /server-status>
SetHandler server-status
</Location>
ワイルドカードと正規表現
Directory,
Files,
Location
ディレクティブでは、 C 標準ライブラリの fnmatch
のように
shell スタイルのワイルドカードキャラクタが使用できます。
"*" 文字は任意の文字列にマッチし、"?" 文字は任意の 1 文字にマッチし、
"[seq]" は seq の任意の文字にマッチします。
"/" 文字はどのワイルドカードでもマッチされません。
明示的に指定する必要があります。
これより柔軟なマッチングが必要な場合は、これらのコンテナに正規表現
(regex) 版である
DirectoryMatch,
FilesMatch,
LocationMatch
があり、マッチを選択するのに perl 互換正規表現を使用できます。しかし、次の設定のマージに目を通して、
regex セクションを使用することで、ディレクティブの適用がどのように
変化するか把握しておいてください。
全ユーザディレクトリの設定を変更する、非 regex
ワイルドカードセクションは次のようになります。
<Directory /home/*/public_html>
Options Indexes
</Directory>
regex セクションを使用することで、画像ファイルの多くのタイプに対する
アクセスを一度に拒否できます。
<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
</FilesMatch>
いつ何を使うか
ファイルシステムコンテナとウェブ空間コンテナを使い分けるのは、
実際には非常に簡単です。ファイルシステムに依存する
オブジェクトにディレクティブを適応する場合は、必ず
Directory か
Files
を使用します。ファイルシステムに依存しないオブジェクト
(データベースから生成されるウェブページなど)
にディレクティブを適用する際には、
Location
を使用します。
ファイルシステム上のオブジェクトへのアクセスを制限するために、
Location
を決して使用ないようにしましょう。
同一のファイルシステム位置にマップしている、ウェブ空間位置 (URL)
が多数あって、設定した制限を迂回されてしまうかもしれないからです。
例えば次の設定を考えてみましょう。
<Location /dir/>
Order allow,deny
Deny from all
</Location>
http://yoursite.example.com/dir/
へのリクエストでは上手く動作します。しかし大文字小文字を区別しない
ファイルシステムを使っていたらどうなるでしょう?
http://yoursite.example.com/DIR/
へのリクエストで簡単にアクセス制限を迂回されてしまいます。これに対して
Directory
ディレクティブを使用すると、どのように呼び出されたかに関わらず
その場所から提供される内容に適用されます。
(例外はファイルシステムのリンクです。シンボリックリンクを使って、
同一のディレクトリを複数のファイルシステムに設置できます。
Directory
ディレクティブはパス名をリセットすることなくシンボリックリンクを
辿ります。ですから、高度なセキュリティが要求される場合は、
適切に Options
ディレクティブを使用してシンボリックリンクを無効にするべきです。)
大文字小文字を区別するファイルシステムを使用しているから上記のことは
無関係だと思われるかもしれませんが、
同一のファイルシステム位置に複数のウェブ空間位置をマップする方法は、
他にいくらでもあるということを覚えていてください。
ですからできる限りファイルシステムコンテナを使用してください。
しかしながら一つだけ例外があります。
<Location />
セクションはどんな URL
にも関わらず適用されるので、完全に安全です。
セクションのマージ方法
マージの順番は以下のようになっています:
- Directory (正規表現無し) と
.htaccess
を同時に (.htaccess
が許可されていれば、それが
Directory を上書きします)
- DirectoryMatch
(と
<Directory ~>
- Files と
FilesMatch を同時に
- Location と
LocationMatch を同時に
Directory
以外は、それぞれのグループは設定ファイルに現れた順番に処理されます。
Directory (上のグループ 1)
はディレクトリが短いものから長いものへと処理されます。ですから、
例えば <Directory /var/web/dir1>
は
<Directory /var/web/dir/subdir>
の前に処理されます。複数の
Directory セクションが
同じディレクトリに
適用される場合は、設定ファイル中の順番に従って処理されます。
Include
によって挿入された設定は 挿入しているファイルの
Include
ディレクティブの位置にあったかのように扱われます。
VirtualHost セクション中のセクションは
バーチャルホストの定義の外側の対応するセクションの
後に適用されます。これによりバーチャルホストが
メインのサーバ設定を上書きできるようなります。
mod_proxy でリクエストが処理される場合は、
処理順番のうち、Directory コンテナの部分が
Proxy
コンテナに取って代わられます。
後のセクションのディレクティブが前のセクションのものを上書きします。
技術メモ
実際には、名前を変換する段階 (URL
をファイル名にマップするために Alias
や
DocumentRoot
が使用されるところ) の直前に
Location/LocationMatch
が行なわれます。
これらを適用した結果は変換が終わった後に完全に捨てられます。
例
次はマージの順番を示すための恣意的な例になっています。
リクエスト全てに適用されるとして、本例のディレクティブは
A > B > C > D > E の順番に適用されます。
<Location />
E
</Location>
<Files f.html>
D
</Files>
<VirtualHost *>
<Directory /a/b>
B
</Directory>
</VirtualHost>
<DirectoryMatch "^.*b$">
C
</DirectoryMatch>
<Directory /a/b>
A
</Directory>
もっと具体的な、次の例を考えてみましょう。
Directory
セクションに設置されたアクセス制限に関わらず、
Location
セクションが最後に評価されて、サーバへのアクセスは制限されません。
言い換えれば、マージの順番は重要で、注意して使用してください!
<Location />
Order deny,allow
Allow from all
</Location>
# Woops! This <Directory> section will have no effect
<Directory />
Order allow,deny
Allow from all
Deny from badguy.example.com
</Directory>