tabimoba.net

とあるエンジニアの雑記帳

ApacheでFilesやFilesMatchが反映されない問題とその原因

※Qiitaからの移行記事となります

Apacheのconfにはデフォルトで次のような記述があり、通常は.htaccessなどが見えてしまうことはありませんが、設定によっては.htaccessファイルが丸見えになってしまう(FilesやFilesMatchの設定が無視される)場合があります。

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

例えば、次のような設定が行われていると、FilesやFilesMatchの設定が評価されず、.htaccessが見えてしまう原因となります。

<Location "/">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<DirectoryMatch>

原因

ディレクティブには優先順があります。

<Directory>  <   <Files>   <   <Location>

上記のように種類の異なるセクションが混在し、かつセクション同士で一部あるいは全部の条件が重複する場合は、優先度の高いセクションの内容が評価されます。つまり、<Files>よりも<Location "/"> の優先度が高いため、<Files>が評価されない問題が発生します。

そして、設定は記述順(上から順)に評価されるとは限らず、<Files><Location>の前に持ってこようが、後ろに持ってこようが結果は変わりません。

対応

Locationを使わず、DirectoryやDirectoryMatchを使います。 Locationはトラブルになりやすいため、なるべくLocationを使用しない運用とすることが望ましいといえます。

<Directory "/var/www/html">
        <RequireAll>
                Require all granted
                Require not ip 192.168.0.0/24
                Require not ip 192.168.1.0/24
                Require not ip 192.168.2.0/24
        </RequireAll>
<Directory>

参考