Подтвердить что ты не робот

Конфигурация Apache: регулярное выражение для отключения доступа к файлам/каталогам, начинающимся с точки

Я хочу отключить доступ к любому файлу ИЛИ каталогу, имя которого начинается с точки. Я придумал следующее, но он отключает доступ к файлам/каталогам, начинающимся с 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

Какое регулярное выражение для достижения этой цели?

4b9b3361

Ответ 1

Код не работает, поскольку <Files> применяется только к базовому имени запрашиваемого документа. То есть, часть после последней косой черты. (источник: 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>

Ответ 2

RewriteRule (^\.|/\.) - [F]

Отказ от просмотра любых файлов или каталогов, начинающихся с точки. Он влияет на любой уровень в дереве путей.

Модификатор

[F] в конце говорит, что запрещает доступ (нет необходимости в модификаторе L сказать, что это последнее правило применяется, оно подразумевается по умолчанию).

Регулярное выражение состоит из двух частей (любое из них разрешено сопоставлять, не обязательным для обоих):

(part1|part2)

Первая часть соответствует любому, что начинается с точки (для случая, когда вы используете его в файле .htaccess для каждого каталога, и в начале строки, которую мы сопоставляем, не будет слэш):

^\.

Например, это будет работать для .test, .git/HEAD но не будет работать для /.git, path/.hidden.

Вторая часть соответствует всем, что содержит слэш, за которым следует точка. Это полезно, если у вас есть это правило в VirtualHost или в боковой конфигурации Apache, в которой строка case, которую мы сопоставляем, может начинаться со слэша.

Это правило будет соответствовать: /.git, some/.hidden Это правило не будет соответствовать: .git, .hidden

Когда мы объединяем эти оба правила, кажется, что мы охватываем все возможные случаи.

Ответ 3

Это отлично работает для меня (Apache 2.4):

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

Отрицает любой URL-адрес, содержащий компонент, начинающийся с точки (файл или каталог).

Ответ 4

С переписыванием mod:

RewriteEngine on

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

Каждый файл или каталог, начинающий с точки, будет перенаправлен на 404.

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