LoginSignup
46

More than 5 years have passed since last update.

Apache 2.4 の Require ディレクティブのマージとか

Posted at

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> などのセクションに書かれたディレクティブは、下記のようにマージされます。

ただし、Require ディレクティブは複数のセクションに記述されていてもマージされません(後述の通りマージさせることもできる)。
下記の例だと /var/www/html には、セクションの優先度が高い Require ip 10. のみ適用されます。

<Directory /var/www>
    Require ip 192.168.
</Directory>
<Directory /var/www/html>
    Require ip 10.
</Directory>

Require ipRequire 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 だけにすることはできないようです(なぜ?)。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46