Apache2.4でOrder/Allow/Denyディレクティブを利用する

Apache 2.2 以前にアクセス制限を行うために使用していた Order 、 Allow 、 Deny の 3 つのディレクティブですが、 Apache 2.4 では非推奨となりそのまま使用するとエラーが発生します。ただ何らかの理由で Apache 2.4 でも引き続き使用したい場合には mod_access_compat モジュールを組み込むことが利用可能となります。ここでは Apache 2.4 の環境で Order 、 Allow 、 Deny ディレクティブを利用する方法について解説します。

(Last modified: )

AllowとDenyが評価される順番を指定する

最初に Apache 2.2 およびそれ以前のバージョンで Order 、 Allow 、 Deny ディレクティブを使ってアクセス制限を行っていた方法について簡単に解説します。最初に Order ディレクティブを使って Allow ディレクティブと Deny ディレクティブが評価される順番を指定します。次のいずれかを記述します。

Order Allow,Deny     許可してから拒否
Order Deny,Allow     拒否してから許可

Allow,Deny と指定した場合、最初に Allow ディレクティブのいずれかにマッチしたもののなかで、 Deny ディレクティブのいずれにもマッチしなかったものがアクセスを許可されます。それ以外はアクセスが拒否されます。例えばすべてのアクセスを許可したあと、特定の IP アドレスからのアクセスは拒否する、といった場合に使用します。

Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx

Deny,Allow と指定した場合、最初に Deny ディレクティブのいずれかにマッチしたもののなかで、 Allow ディレクティブのいずれにもマッチしなかったものがアクセスを拒否されます。それ以外はアクセスが許可されます。例えばすべてのアクセスを拒否したあと、特定の IP アドレスからのアクセスは許可する、といった場合に使用します。

Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx

※ Allow と Deny の間にはカンマ(,)だけを記述してください。空白を入れて Order Allow, Deny のように記述するのは誤りです。

なお Order ディレクティブ、およびこのあとで解説する Allow ディレクティブと Deny ディレクティブを記述できる場所は Directory, .htaccess です。 .htaccess で設定する場合は AllowOverride Limit が設定されている必要があります。

アクセスを許可する対象と拒否する対象を指定する

次にアクセスを許可する対象 を Allow ディレクティブを使って指定し、アクセスを拒否する対象を Deny ディレクティブを使って指定します。

Allow from 対象
Deny from 対象

対象として指定できるものには次のようなものがあります。

all

all を指定した場合はすべてのアクセスが対象となります。 Allow from all であれば全てのアクセスが許可され、 Deny from all であれば全てのアクセスが拒否されます。

Allow from all
Deny from all

IPアドレス

IP アドレスを指定した場合は、その IP アドレスを持つリクエスト元からのアクセスが対象となります。 IP アドレスの記述方法には次のようなものがあります。

Allow from 192.168.1.2
Allow from 192.168.1
Allow from 192.168.1.0/255.255.255.0
Allow from 192.168.1.0/24

例えば 192.168.1.2 からのアクセスを許可する場合は次のように記述します。

Allow from 192.168.1.2

ホスト名

ホスト名を指定した場合は、リクエスト元のホスト名からのアクセスが対象となります。リクエスト元のホスト名を求める手順は Apache 2.4 の場合と同じです。例えば example.com と後ろの部分が一致するホストからのアクセスを許可する場合は次のように記述します。

Allow from example.com

環境変数

環境変数が定義されている場合にアクセスを許可する、またはアクセスを拒否するようにする場合は次のように記述します。

Allow from env=環境変数名
Deny from env=環境変数名

例えば環境変数 my_referral が定義されている場合だけアクセスを許可するには次のように記述します。( SetEnvIf ディレクティブはリクエストの属性に基づいて環境変数を設定するディレクティブです)。

SetEnvIf Referer www\.example\.com my_referral
Allow from env=my_referral

※ SetEnvIf ディレクティブの使い方については「SetEnvIfディレクティブ:リクエストに含まれる情報に基づいて環境変数を設定する」を参照されてください。

mod_access_compatモジュールを組み込む

Apache 2.4 以降では Order 、 Allow 、 Deny の 3 つのディレクティブは非推奨となっており、利用するには mod_access_compat モジュールを組み込んでおく必要があります。

まずモジュールを組み込んでいなかった場合で試してみます。 Apache 2.4 の環境で、 httpd.conf ファイルに次のように記述しました。

<Directory "${SRVROOT}/htdocs/user">
  Order Allow,Deny
  Allow from all
  Deny from 192.168.10.1
</Directory>

mod_access_compatモジュールを組み込む(1)

httpd.conf ファイルを保存したあと、 Apache を再起動しようとすると次のようなエラーがでて起動することができませんでした。

AH00526: Syntax error on line 541 of C:/pg/Apache24/conf/httpd.conf:
Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration

mod_access_compatモジュールを組み込む(2)

それでは mod_access_compat モジュールを組み込みます。 httpd.conf ファイルを開き次の行を検索してください。

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
#LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so

mod_access_compatモジュールを組み込む(3)

先頭の # を外してください。これで次回起動時から mod_access_compat モジュールが Apache に組み込まれます。

LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so

確認のため httpd -t と実行してみると Syntax OK と表示されました。 httpd と実行すると Apache も無事起動しました。

>httpd -t
Syntax OK

mod_access_compatモジュールを組み込む(4)

これで Apache 2.4 の環境であっても Order 、 Allow 、 Deny ディレクティブを使ったアクセス制限の設定を使用することができます。

-- --

Apache 2.4 の環境で Order 、 Allow 、 Deny ディレクティブを利用する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。