Apache 2.4 の Require
ディレクティブのマージについてのメモ(+α)が出てきたので置いときます。
- CentOS 7.1.1503
- Apache 2.4.6
デフォルト
Require はデフォルトは許可です。
ただし CentOS 7 だと、最初から httpd.conf に次のように設定されています。
<Directory />
Require all denied
</Directory>
<Directory "/var/www">
Require all granted
</Directory>
<Directory "/var/www/html">
Require all granted
</Directory>
<Files ".ht*">
Require all denied
</Files>
<Directory "/var/www/cgi-bin">
Require all granted
</Directory>
セクションのマージ
Apache では複数の <Directory>
などのセクションに書かれたディレクティブは、下記のようにマージされます。
- How the sections are merged - Apache HTTP Server Version 2.4
- セクションのマージ方法 - Apache HTTP サーバ バージョン 2.4
ただし、Require
ディレクティブは複数のセクションに記述されていてもマージされません(後述の通りマージさせることもできる)。
下記の例だと /var/www/html
には、セクションの優先度が高い Require ip 10.
のみ適用されます。
<Directory /var/www>
Require ip 192.168.
</Directory>
<Directory /var/www/html>
Require ip 10.
</Directory>
Require ip
と Require method
のように条件が異なっていてもマージされません。
下記の例だと、/var/www/html
には任意の宛先からの POST メソッドだけが許可されます。
<Directory /var/www>
Require ip 192.168.
</Directory>
<Directory /var/www/html>
Require method POST
</Directory>
もし、<Directory /var/www/html>
に Require
が無ければ、(優先度が)直前のセクションの設定がそのまま適用されます。
下記の例だと /var/www/html
にも Require ip 192.168.
が適用されます。
<Directory /var/www>
Require ip 192.168.
</Directory>
<Directory /var/www/html>
Options none
</Directory>
なお、同じディレクトリでもセクションが異なれば別セクションなので Require
はマージされません。
<Directory /var/www/html>
Require ip 192.168.
</Directory>
<Directory /var/www/html>
Require ip 10.
</Directory>
マージを有効にする
AuthMerging
で複数セクションの Require
のマージを有効にすることができます。
AuthMerging Or
なら、(優先度が)直前のセクションと OR でマージされます。
下記の例では 127.
と 10.
の両方が許可されます。
<Directory /var/www>
Require ip 127.
</Directory>
<Directory /var/www/html>
AuthMerging Or
Require ip 10.
</Directory>
AuthMerging And
なら、(優先度が)直前のセクションと And でマージされます。
下記の例では 10.
からの GET のみが許可されます。
<Directory /var/www>
Require method GET
</Directory>
<Directory /var/www/html>
AuthMerging And
Require ip 10.
</Directory>
デフォルトは AuthMerging Off
なので、前述の通りマージされません。
なお、AuthMerging
はマージされないので、下記の例だと /var/www/html
には Require ip 10.
しか適用されません。
<Directory /var>
Require ip 192.168.
</Directory>
<Directory /var/www>
AuthMerging Or
Require ip 127.
</Directory>
<Directory /var/www/html>
Require ip 10.
</Directory>
暗黙の <RequireAny>
下記の2つは同じです。つまり、<Directory>
などのセクションの直下に Require
を記述すると、暗黙的に <RequireAny>
で囲われます。
<Directory /var/www/html>
Require ip 127.
Require ip 10.
</Directory>
<Directory /var/www/html>
<RequireAny>
Require ip 127.
Require ip 10.
</RequireAny>
</Directory>
特定のアドレスだけ拒否
次のように <RequireAll>
を使います。下記の例では 127.0.0.1
が拒否されます。
<Directory /var/www/html>
<RequireAll>
Require all granted
Require not ip 127.0.0.1
</RequireAll>
</Directory>
これは次のように <RequireNone>
を使っても同じです。
<Directory /var/www/html>
<RequireAll>
Require all granted
<RequireNone>
Require ip 127.0.0.1
</RequireNone>
</RequireAll>
</Directory>
なお、<RequireAll>
に Require all granted
が無いとエラーになります。
AH01624: <RequireAll> directive contains only negative authorization directives
<RequireAll>
の中身を not だけにすることはできないようです(なぜ?)。