web-dev-qa-db-ja.com

FilesMatchを使用してすべてのPHPファイルへのアクセスを拒否しますが、1つのファイルに対して例外を作成します

現在、htaccessを使用して、ディレクトリ内のすべてのPHPファイルへのアクセスを拒否していますが、同じディレクトリ内のJS、PNG、CSSファイルは拒否していません。

<FilesMatch "\.php$">
Order deny,allow
Deny from all
</FilesMatch>

ただし、1つのファイル(たとえば、「foobar.php」)を例外にしたい場合はどうなりますか? 1つのhtaccessで複数のステートメントを記述できますか?実行の順序は何ですか?

4
posfan12

1つのhtaccessで複数のステートメントを記述できますか?

はい、できます。同じcontext内の複数の<FilesMatch>コンテナ(つまり、.htaccess)は順番にマージされます。したがって、すべての.phpファイルをブロックし、特定のfoobar.phpファイルをこの順序で許可できます。

例えば:

# Block all ".php" files
<FilesMatch "\.php$">
Order deny,allow
Deny from all
</FilesMatch>

# Permit a specific ".php" file
<FilesMatch "^foobar\.php$">
Order deny,allow
Allow from all
</FilesMatch>

または、単一の<FilesMatch>コンテナを使用し、正規表現でnegative lookaheadを使用して、特定のファイルを除外できます。

# OR use a negative lookahead...
<FilesMatch "^(?!foobar\.php$).+\.php$">
Order deny,allow
Deny from all
</FilesMatch>

否定先読み表明(?!foobar\.php$)は、他のすべてのfoobar.phpファイルと一致する一方で、正規表現が.phpと一致しないことを保証します。

OrderDenyAllowは厳密にApache 2.2のディレクティブであることに注意してください。 Apache 2.4を使用している場合は、おそらくこれをそれぞれRequire all deniedおよびRequire all grantedに変更する必要があります(システム全体でmod_authz_coreに変更した場合)。

<FilesMatch>コンテナは現在のディレクトリとすべてのサブディレクトリに適用されることにも注意してください。

4
MrWhite