[ホーム] -> [Aache + PHP + PostgreSQL 実験室]

範囲指定のディレクティブ

特別なディレクティブとして、範囲指定が出来るディレクティブがあります。条件にマッチしたもののみ、その中の設定が適用されます。まあ、プログラミング言語で言う IF 文みたいなものですね。適切に使うと便利だし、Directory などのように必ずと言っていいほど使うものもあります。

目次

説明

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

module-name が利用可能であると、これで囲まれた間の設定が有効になります。LoadModule でモジュールがロードされているか、コンパイル時に組み込んでいる場合かです。つまり、モジュール固有の設定を、これで囲んでおくことで、そのモジュールを無効にした場合などに httpd.conf を修正しなくてすむようになります。module-name は大抵、mod_???.c となっています。module-nameの前に ! を付けると逆の動作になり、モジュールが利用できない場合となります。このディレクティブはネストすることが出来ます。

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

httpd 起動時に、-D オプションで define-name が指定されたとき、これで囲まれた間の設定が有効になります。例えば、httpd -DSSL と実行された場合、<IfDefine SSL> と指定されていれば、そこが有効になります。define-nameの前に ! を付けると逆の動作になり、オプションが指定されていない場合となります。このディレクティブはネストすることが出来ます。

<Directory path>
...
</Directory>

path で指定されたディレクトリ以下にある、ファイルやディレクトリに対するアクセスに対しての設定を行います。あるディレクトリ以下はパスワードの認証が必要、とか、こっちのディレクトリは CGI を置いておく、などと言った設定を行うときに利用します。path には、?* のワイルドカードが利用できます。? は何か一文字に、* は任意の文字列にマッチします。/home/*/public_html と指定すれば、/home/hizuya/public_html や、/home/dareka/public_html などにマッチします。このディレクティブはネストできません。

<DirectoryMatch path-regex>
...
</DirectoryMatch>

これも上と同じでディレクトリに対しての設定ですが、ディレクトリを正規表現で表せます。

<Location url>
...
</Location>

これは、リクエストの URL が、url 以下のファイルやディレクトリに対してのだった場合に、これで囲まれた間の設定が有効になります。リクエストの文字列を見るので、物理的にどのファイルにアクセスされるかは関係ありません(物理的なファイルが存在しなくても大丈夫)。例えば <Location "/access-list"> とすると、http://サーバ名/access-list というアクセスにマッチします(これに対応するファイルがあるかは関係ない)。これも、?* のワイルドカードが利用できます。このディレクティブはネストできません。

<LocationMatch url-regex>
...
</LocationMatch>

上と同じリクエストの URL を対象にしますが、URL を正規表現で表せます。

<Files file-name>
...
</Files>

file-name に対してアクセスがあった場合に、これで囲まれた間の設定が有効になります。これはファイルのあるディレクトリは関係なく、ファイル名だけで制御します。例えば、<Files "*.html"> と指定した場合、拡張子が html のファイルにマッチします。これも、?* のワイルドカードが利用できます。このディレクティブはネストできません。

<FilesMatch file-name-rexex>
...
</FilesMatch>

上と同じファイル名を対象にしますが、ファイル名を正規表現で表せます。

<VirtualHost ip-address[:port]>
...
</VirtualHost>

バーチャルホストの設定を行います。バーチャルホストについては、後で別途説明しているので、そちらを参照してください。

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

method には、HTTP のメソッドがスペースで区切って複数指定できます。現在、GET, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK が指定できるようです。リクエストのメソッドがここで指定されていた場合、これで囲まれた間の設定が有効になります。あるメソッド以外を禁止したい場合などは、これを使うより次の LimitExcept をお勧めします。このディレクティブはネストできません。

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

上と同じように、method には、HTTP のメソッドがスペースで区切って複数指定できます。リクエストのメソッドがここで指定されてもの以外の場合、これで囲まれた間の設定が有効になります。例えば <LimitExcept GET POST> とし、間に Deny from all と書いておけば、GET と POST 以外のアクセスはすべて禁止されます。

<Directory>, <Location>, <Files> は非常に似ているのが分かったかと思いますが、適用される順番があります。<Directory> の正規表現付きについては説明していませんが、<DirectoryMatch> を使うようになっていますので、気にしないでください。

  1. <Directory>(正規表現無し)と .htaccess を同時(.htaccess で上書きできるように指定してあった項目は、.htaccess で上書きされる)
  2. <DirectoryMatch> と正規表現付きの <Directory>
  3. <Files><FilesMatch> を同時
  4. <Location><LocationMatch> を同時

正規表現が使えるものに関しては、マニュアルによると「Perl のサブセット」ということらしいです。一応、「. ? * + ^ $ [ ] ( | ) {}」が使えることは確認しています。

戻る