Конфигурация 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
Какое регулярное выражение для достижения этой цели?
Ответы
Ответ 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