Как запретить доступ к файлу в .htaccess


112

У меня есть следующий файл .htaccess:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

Я пытаюсь запретить посетителям доступ к следующему файлу:

domain.com/inscription/log.txt

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

Ответы:


187

В файле htaccess область действия <Files>директивы применяется только к этому каталогу (я думаю, чтобы избежать путаницы, когда применяются правила / директивы в htaccess подкаталогов, заменяя их из родительского).

Итак, вы можете иметь:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

Для Apache 2.4+ вы должны использовать:

<Files "log.txt">  
  Require all denied
</Files>

В файле htaccess в вашем inscriptionкаталоге. Или вы можете использовать mod_rewrite для сортировки обработки, в обоих случаях запрещающий доступ к файлу htaccess, а также к log.txt:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]

Если вы используете IIS, сделайте это в файле web.config.
Shaun Luttin

1
Использование правил перезаписи запрещает моему собственному коду доступ к содержимому * .txt. Как бы вы это обошли?
Pantss 06

8
«область действия <Files>директивы применяется только к этому каталогу» - нет. Он применяется к этому каталогу и всем подкаталогам под ним. Так <Files "log.txt">поймают /log.txt и /inscription/log.txt .
MrWhite

1
Можете ли вы обновить этот ответ, поскольку Order Allow,Denyон устарел в версии 2.4?
Telarian 02

18

Сильное сопоставление с образцом - это метод, который я использую в Perishable Press. Используя строгое сопоставление с образцом, этот метод предотвращает внешний доступ к любому файлу, содержащему « .hta », « .HTA » или любую их комбинацию без учета регистра. Чтобы проиллюстрировать, этот код предотвратит доступ по любому из следующих запросов:

  • .htaccess
  • .htaccess
  • .hТаксы
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT.hTACCES

.. и т. д. и т. д. Очевидно, что этот метод очень эффективен для защиты файлов HTAccess вашего сайта. Кроме того, этот метод также включает укрепляющую директиву « Удовлетворять всем ». Обратите внимание, что этот код следует поместить в корневой файл HTAccess вашего домена:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

1
При использовании этого кода я получаю внутреннюю ошибку сервера 500. Есть идеи, почему? Я использую Wordpress.
Керин Гилл

8
Разве не имеет смысла просто запретить пользователям доступ к точечным файлам? Используя что-то вроде <Files ~"^\..*">.
Steen Schütt

1
Нужен пробел между тильдой и первой кавычкой - по крайней мере, мне он нужен. ~ ПРОСТРАНСТВО "
Арт Гейгель

Я получил такое же поведение при отключении .files: <filesMatch "^ \ .. *"> разрешить порядок, запретить запретить для всех </FilesMatch>
Пинонирвана

14

Я не верю, что принятый в настоящее время ответ правильный. Например, у меня .htaccessв корне виртуального сервера (apache 2.4) есть следующий файл:

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

Это предотвращает внешний доступ к reminder.phpкоторому находится в подкаталоге. У меня есть аналогичный .htaccessфайл на моем сервере Apache 2.2 с таким же эффектом:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

Я не знаю наверняка, но подозреваю, что это попытка определить подкаталог специально в .htaccessфайле, а именно, <Files ./inscription/log.txt> что приводит к его сбою. Было бы проще поместить .htaccessфайл в тот же каталог, что и log.txtв inscriptionкаталоге, и он будет работать там.


1
Вы получаете мой голос, это сработало и для моего apache 2.4.
Tschallacka


-4

Ну, вы можете использовать <Directory>тег, например:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

Не используйте, ./потому что, если вы просто используете, /он просматривает корневой каталог вашего сайта.

Для более подробного примера посетите http://httpd.apache.org/docs/2.2/sections.html.


2
Но <Directory>контейнер не допускается .htaccess. В .htaccess, сам .htaccessфайл является « Контейнером Каталога » (файл конфигурации для каждого каталога).
MrWhite

Что ж, тогда вы можете использовать Redirect. Redirect /inscription/log.txt access_denied.htmlЭто перенаправит пользователя, access_denied.htmlесли пользователь перейдет inscription/log.txtв каталог с надписью.
Николас Инглиш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.