Apache | Apacheの基本設定 | アクセス許可範囲の設定(セクションコンテナ)

Apacheでは、アクセスを許可する適用範囲をディレクトリ単位やファイル単位で制限できる。ここでは、構成の適用範囲を指定する方法について説明する。

構成の適用範囲を制限する

httpd.confファイルを見ると、次のような内容を確認できる。

<Directory />
    AllowOverride none
    Require all denied
</Directory>

<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Files ".ht*">
    Require all denied
</Files>

似たような設定が繰り返し行われている。実際の設定が影響を受ける範囲を指定し、その範囲ごとに設定している。この範囲を指定するための記述をセクションコンテナと呼び、<Directory><Files>などを使って記述する。

影響範囲の指定は、ディレクトリ単位で指定する方法、ファイル単位で指定する方法、URLのパス名単位で指定する方法の3種類で指定できる。たとえば、ディレクトリ内のファイルを見るには認証が必要になるように設定できる。

簡単に書き方を見ていく。

ディレクトリ単位で指定する

ディレクトリ単位で範囲を指定する場合は、セクションコンテナとして<Directory>を使用する。

<Directory パス>
    ...
    設定ディレクティブ
    ...
</Directory>

ディレクトリを表すパスはフルパスで指定する。Windowsの場合はドライブから指定する。アスタリスク(*)やクエスチョンマーク(?)のようなワイルドカードを使った指定も可能である。

<Directory />
    ...
</Directory>


<Directory "${SRVROOT}/htdocs">
    ...
</Directory>

上の例では、パスとして/${SRVROOT}/htdocsの2つが指定されている。ディレクトリで指定した場合、指定したディレクトリと、そのディレクトリに含まれるすべてのサブディレクトリが対象になる。${SRVROOT}/htdocsと指定すると、このディレクトリ配下にあるすべてのファイルとサブディレクトリが対象になる。

${SRVROOT}は次のように指定されているため、${SRVROOT}/htdocsの実際のパスはC:/apache/Apache24/htdocsになる。

Define SRVROOT "C:/apache/Apache24"

パス名/と書かれた部分は特別である。前述のとおり、ディレクトリで指定した場合はすべてのサブディレクトリが対象になる。/はルートディレクトリを表すため、パスを/に指定するとすべてのファイルに適用される。つまり、ここに書かれた設定は、個別に設定されていないすべてのディレクトリのデフォルト設定になる。

別のディレクトリに設定を書き、そのサブディレクトリに対してさらに別の設定を書くこともできる。この場合、対象ディレクトリには2つの設定、正確にはルートに対する設定も含めれば3つの設定が適用される可能性がある。ディレクトリで指定する場合は、ルートからの長さが短い順、つまりパスが短い順に適用され、同じ設定項目は上書きされる。

ファイル単位で指定する

ファイル単位で範囲を指定する場合は、セクションコンテナとして<Files>を使用する。

<Files ファイル名>
    ...
    設定ディレクティブ
    ...
</Files>

ファイル名を指定する場合、該当ファイルが存在するディレクトリに関係なく、特定のファイル名のファイルや特定の拡張子を持つファイル全般に設定したいときに便利である。ファイル名にも、アスタリスク(*)やクエスチョンマーク(?)のようなワイルドカードを使った指定が可能である。

httpd.confファイルに書かれた例を見ると、次のように記述されている。

<Files ".ht*">
    ...
</Files>

上の例では.ht*と指定されているため、このワイルドカードに一致するファイル名がすべて適用対象になる。

また、次のようにファイル名を正規表現で指定することもできる。正規表現で書かれている場合、この正規表現に一致するファイル名がすべて適用対象になる。

<Files ~ "\.(htm|html|css|js|php)$">
   ...
</Files>

上の例では、htmhtmlcssjsphpがすべて適用される。同じように、<FilesMatch>を使っても正規表現を利用できる。<Files>との違いは、~を付けなくても正規表現が適用される点である。

<FilesMatch "\.(htm|html|css|js|php)$">
    ...
</FilesMatch>

ファイル名で範囲指定した設定が複数書かれている場合、書かれた順番に設定が有効になっていく。ディレクトリの場合はパスが最も短いものから適用されたが、ファイル名の場合は記述順に適用される点に注意する。

URLパス単位で指定する

URLパス単位で範囲を指定する場合は、セクションコンテナとして<Location>を使用する。

<Location URLパス>
    ...
    設定ディレクティブ
    ...
</Location>

実際のファイルの存在場所とは関係なく、どのように呼び出されるかというURLパス、およびそのURLパスで始まるすべてのURLに設定が適用される。URLがhttp://ホスト/aaa/bbbであれば、/aaa/bbb部分を指定する。

<Location /aaa/bbb>
    ...
</Location>

Locationは、データベースから動的にURLを生成する場合に使うと便利である。

実際の設定方法

3つのセクションコンテナが書かれている場合、設定は「ディレクトリ」、「ファイル名」、「URLパス」の順に適用され、その後の設定で上書きされる。

ここでは実際のファイルに対するアクセス設定方法の一つとして、LocationのURL表記による設定を説明しているが、これはあくまでファイルへのアクセス方法に対する制限であり、実際のファイルに対する範囲設定ではない。問題ない場合もあるが、存在するファイルに対する設定は、できるだけDirectoryFilesを使用して記述する。

参照