9.5. ディレクティブとコンテキスト

Apache の設定は、設定ファイルである /etc/httpd/conf/httpd.conf にディレクティブを記述することで行います。/etc/httpd/conf/httpd.conf には、1 行に 1 つのディレクティブを記述します。Apache には、各モジュールを制御するための様々なディレクティブが提供されており、それらのディレクティブを指定することにより、Apcahe の動作を制御することができます。また、ディレクティブの中には、ディレクティブ名とその値が < と > で囲まれたものもあります。これらのディレクティブは終了タグまでを適用範囲として扱い、開始タグと終了タグの中に記述されたディレクティブは、その範囲内でのみ有効となります。ここでは、各モジュールを制御する個々のディレクティブを解説する前に、これらのコンテナとなるディレクティブについて解説します。また、ディレクティブを記述する際に重要となるコンテキストについても解説します。

9.5.1. コンテナとなるディレクティブ

コンテナとなるディレクティブには、以下があります。

<Directory directory-path> ... </Directory>

<Directory directory-path> から </Directory> の間に指定されたディレクティブは、directory-path に指定されたディレクトリとそのサブディレクトリにのみ適用されます。例えば、以下の指定では、/var/www/html/data とそのサブディレクトリにのみ適用されます。

<Directory "/var/www/html/data">

  ...

</Directory>

また、directory-path の指定には正規表現を使用することもできます。その場合には、以下のように directory-path の前に ~(チルダ)を指定します。

<Directory ~ "/var/www/html/data*">

    ...

</Directory>

<DirectoryMatch regex> ... </DirectoryMatch>

<Directory> ディレクティブと同様ですが、ディレクトリの指定に必ず正規表現を使用します。~ を指定する必要はありません。

<Files filename> ... </Files>

<Files filename> から </Files> の間に指定されたディレクティブは、filename に指定されたファイルにのみ適用されます。<Directory> ディレクティブと同様に filename の前に ~ を指定し、正規表現を使用することもできます。例えば、以下の指定では、.ht で始まるファイルにのみ適用されます。

<Files ~ "^\.ht">

    ...

</Files>

<FilesMatch regex> ... </FilesMatch>

<Files> ディレクティブと同様ですが、ファイルの指定に必ず正規表現を使用します。

<Location URL-path|URL> ... </Location>

<Location URL-path|URL> から </Location> の間に指定されたディレクティブは、URL-path|URL に指定された URL へのアクセスにのみ適用されます。<Directory> ディレクティブは、ファイルシステム上のディレクトリパスを指定するのに対して、<Location> ディレクティブでは、URL を指定します。<Directory> ディレクティブと同様に URL-path|URL の前に ~ を指定し、正規表現を使用することもできます。例えば、サーバーの FQDN を www.example.com とすると、以下の指定では、http://www.example.com/server-status へのアクセスにのみ適用されます。

<Location /server-status>

    ...

</Location>

<LocationMatch regex> ... </LocationMatch>

<Files> ディレクティブと同様ですが、URL の指定に必ず正規表現を使用します。

<Limit method [method] ... > ... </Limit>

<Limit> ディレクティブを使用すると、HTTP リクエストに含まれる POST や GET など、特定のメソッドに対するアクセス制御を指定することができます。<Limit method [method] ... > から </Limit> の間に指定されたディレクティブは、method [method] ... に指定されたメソッドでアクセスしてきた要求にのみ適用されます。例えば、以下の指定では、POST メソッドでアクセスしてきた要求にのみ適用されます。

<Limit POST>

    ...

</Limit>

<LimitExcept method [method] ... > ... </LimitExcept>

<Limit> とは逆に、指定したメソッド以外でアクセスしてきた要求に対してのみ適用されます。

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>

バーチャルホストを指定するためのディレクティブです。詳細については、項9.21 を参照してください。

<IfModule [!]module-name> ... </IfModule>

<IfModule> ディレクティブでは、モジュールがサーバーに読み込まれているときだけ有効になるディレクティブを指定できます。<IfModule [!]module-name> から </IfModule> の間に指定されたディレクティブは、module-name に指定されたモジュールがサーバーに読み込まれているときのみ適用されます。!module-name の場合は、逆にモジュールが読み込まれていないときに適用されます。

<IfDefine [!]parameter-name> ... </IfDefine>

<IfDefine> ディレクティブでは、サーバー起動時にパラメータが指定されているときだけ有効になるディレクティブを指定できます。<IfDefine [!]parameter-name> から </IfDefine> の間に指定されたディレクティブは、parameter-name に指定されたパラメータがサーバーの起動時に指定されているときのみ適用されます。!parameter-name の場合は、逆にモジュールが読み込まれていないときに適用されます。例えば、以下の指定では、サーバーの起動時に SSL というパラメータが指定された場合のみ適用されます。

<IfDefine SSL>

    ...

</IfDefine>

9.5.2. コンテキスト

Apache は非常に多くのディレクティブを提供しています。ただし、各ディレクティブは、/etc/httpd/conf/httpd.conf のどの箇所にでも記述できるわけではありません。ディレクティブを記述したコンテキストによっては意味をなさない場合があります。コンテキストとは、/etc/httpd/conf/httpd.conf のどこにディレクティブを記述したときに有効であるかを示すものです。したがって、ディレクティブを指定するときは、そのディレクティブのコンテキストをオンラインマニュアル等で確認しなければなりません。コンテキストの種類と概要は以下の通りです。

表 9-3. コンテキスト

コンテキストの種類概要
server config設定ファイル内で使用可能ですが、<Directory> や <VirtualHost> のようなコンテナとなるディレクティブの中で使用することはできません。
directory<Directory>、<DirectoryMatch>、<Location>、<LocationMatch>、<Files>、<FilesMatch> ディレクティブの中で使用可能であることを意味します。
.htaccess.htaccess ファイル内で使用可能であることを意味します。ただし、.htaccess ファイルによる上書指定が許可されているディレクティブのみ有効になります。.httaccess については、項9.9 を参照してください。
virtual host<VirtualHost> ディレクティブの中で使用可能であることを意味します。

各ディレクティブの指定可能なコンテキストについては、Apache のオンラインマニュアルで確認することができます。

Apache Software Foundation - Apache HTTP サーバ バージョン 2.2 ドキュメント

http://www.apache.org/docs/2.2/