web-dev-qa-db-ja.com

Apache構成:ドットで始まるファイル/ディレクトリへのアクセスを無効にする正規表現

名前が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

これを達成するための適切な正規表現は何ですか?

24
JP19

<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>
54
Lekensteyn
RewriteRule (^\.|/\.) - [F]

これにより、ドットで始まるファイルまたはディレクトリの表示が拒否されます。パスツリーのすべてのレベルに影響します。

最後の[F]修飾子は、アクセスを禁止することを示します(L修飾子が、適用する最後のルールであると言う必要はありません。デフォルトで暗黙的に示されます)。

正規表現には2つの部分があります(どちらも一致することが許可されており、両方である必要はありません)。

(part1|part2)

最初の部分は、ドットで始まるものすべてに一致します(ディレクトリごとの.htaccessファイルで使用し、一致する文字列の先頭にスラッシュがない場合):

^\.

たとえば、これは.test.git/HEADでは機能しますが、/.gitpath/.hiddenでは機能しません。

2番目の部分は、スラッシュの後にドットが続くものすべてに一致します。これは、VirtualHostまたはサイドワイドのApache構成にこのルールがある場合に役立ちます。この場合、一致する大文字と小文字の文字列はスラッシュで始まる場合があります。

このルールは一致します:/.gitsome/.hiddenこのルールは一致しません:.git.hidden

これらの両方のルールを組み合わせると、考えられるすべてのケースをカバーしているように見えます。

19
Meglio

これは私にとって完璧に機能します(Apache 2.4):

<LocationMatch "\/\.">
    Require all denied
</LocationMatch>

ドット(ファイルまたはディレクトリ)で始まるコンポーネントを含むURLを拒否します。

3
Petr Stastny

Rewrite modの場合:

RewriteEngine on

RewriteCond %{THE_REQUEST} ^.*/\.
RewriteRule ^(.*)$ - [R=404]

ドットで始まるすべてのファイルまたはディレクトリは404にリダイレクトされます。

/myDir/.svn => 404
/.gitignore => 404
/dir1/dir2/dir3/..../.toHide => 404
1
ImmortalPC