名前がDOTで始まるファイルORディレクトリへのアクセスを無効にしたい。次のことを思いついたが、DOTで始まるファイル/ディレクトリへのアクセスを無効にするのは、それらが直接である場合のみである。ドキュメントルート内。
<Files ~ "^\.|\/\.">
Order allow,deny
Deny from all
</Files>
これとともに、
http://my_server.com/.svn/entries --> Permission denied
http://my_server.com/abcd/.svn/entries --> Accessible, should be disabled
これを達成するための適切な正規表現は何ですか?
<Files>
は、要求されたドキュメントのbasenameにのみ適用されるため、コードは機能しません。つまり、最後のスラッシュの後の部分です。 (ソース: http://httpd.Apache.org/docs/current/mod/core.html#files )
Apacheは、デフォルトのインストールで.htaccess
ファイルをブロックします(より良い:.ht
で始まるすべてのファイル)。構成ファイルをよく見ると、次のようになります。
<FilesMatch "^\.ht">
Order allow,deny
Deny from all
</FilesMatch>
したがって、ドットで始まるすべてのファイルを非表示にするには、次を使用します。
<FilesMatch "^\.">
Order allow,deny
Deny from all
</FilesMatch>
ドットで始まるディレクトリで機能させるには、次の(テスト済みの)コードを使用します。
<DirectoryMatch "^\.|\/\.">
Order allow,deny
Deny from all
</DirectoryMatch>
RewriteRule (^\.|/\.) - [F]
これにより、ドットで始まるファイルまたはディレクトリの表示が拒否されます。パスツリーのすべてのレベルに影響します。
最後の[F]修飾子は、アクセスを禁止することを示します(L修飾子が、適用する最後のルールであると言う必要はありません。デフォルトで暗黙的に示されます)。
正規表現には2つの部分があります(どちらも一致することが許可されており、両方である必要はありません)。
(part1|part2)
最初の部分は、ドットで始まるものすべてに一致します(ディレクトリごとの.htaccessファイルで使用し、一致する文字列の先頭にスラッシュがない場合):
^\.
たとえば、これは.test
、.git/HEAD
では機能しますが、/.git
、path/.hidden
では機能しません。
2番目の部分は、スラッシュの後にドットが続くものすべてに一致します。これは、VirtualHostまたはサイドワイドのApache構成にこのルールがある場合に役立ちます。この場合、一致する大文字と小文字の文字列はスラッシュで始まる場合があります。
このルールは一致します:/.git
、some/.hidden
このルールは一致しません:.git
、.hidden
これらの両方のルールを組み合わせると、考えられるすべてのケースをカバーしているように見えます。
これは私にとって完璧に機能します(Apache 2.4):
<LocationMatch "\/\.">
Require all denied
</LocationMatch>
ドット(ファイルまたはディレクトリ)で始まるコンポーネントを含むURLを拒否します。
Rewrite modの場合:
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]
ドットで始まるすべてのファイルまたはディレクトリは404にリダイレクトされます。
/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2/dir3/..../.toHide => 404