.htaccessを持つサブディレクトリを1つだけ除いて、ディレクトリへのアクセスを禁止します

Jun 23 2020

ファイルシステムに次のdir構造があります。

/users/[uid1]/

/users/[uid2]/など(UID部分は、/users/abc123/またはのようにURLで動的です/users/def456/

uid-dirsの中には、たとえば次のようなサブディレクトリとファイルもあります。 images-dir another-dir file1 file2

.htaccessファイルもあります。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

したがって、要求されたファイルがファイルシステムに存在しない場合にのみ、ルーティングのためにすべての要求をindex.phpに書き換えます。

どういうわけか/users/[uid]/*以外へのアクセスを禁止できますimages-dirか?

たとえば、次のことを許可します。

/users/123abc/images-dir/some-image.jpg

と拒否:

/users/123abc/another-dir

/users/123abc/file1

このサブディレクトリへの直接アクセスを拒否する必要があり、誰かが禁止されたファイルのコンテンツを取得しようとした場合、index.phpにリクエストを送信したい

.htaccessで行うことは可能ですか?

ありがとう

回答

MrWhite Jun 23 2020 at 07:13

.htaccessドキュメントルートに単一のファイルがあると仮定します。

既存のディレクティブの前に、次のようなことを行うことができます。

# If the request maps to a file or directory in the /users/<uid> space
# But is not the "images-dir" then forbid access
RewriteCond %{REQUEST_URI} !^/users/\w+/images-dir/
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^users/\w+/ - [F]

\w+に一致し<uid>、英数字とアンダースコア文字を含みます。<uid>以下が特定の形式に従っている場合は、ここでより具体的にすることができます。

/users/<uid>/...スペース内の静的リソースのみを参照する場合(つまり、仮想URLを参照しない場合)、すべての要求がファイルシステムリソースを対象としていることがわかっているため、上記のファイルシステムチェックを削除できます。