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 ディレクティブを利用する方法について解説します。

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>

httpd.conf ファイルを保存したあと、 Apache を再起動しようとするとエラーがでて起動することができませんでした。原因を確認するため -t オプションをつけて httpd -t と起動してみると次のようなエラーメッセージが表示されました。

>httpd -t
AH00526: Syntax error on line 547 of D:/pg/Apache/Apache24/conf/httpd.conf:
Invalid command 'Order', perhaps misspelled or defined by a module not included in the server configuration

必要なモジュールが読み込まれていないというエラーができます。

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

#LoadModule access_compat_module modules/mod_access_compat.so

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

LoadModule access_compat_module modules/mod_access_compat.so

改めて httpd -t と起動してみると今度は Syntax OK と表示されました。

>httpd -t
Syntax OK

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

-- --

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

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。