Назад | Перейти на главную страницу

Как сказать Apache не перезаписывать LocationMatch и «Требовать все отклонено»?

У меня установлена ​​следующая директива security.conf чтобы Apache не обслуживал скрытые файлы и каталоги.

<LocationMatch ^(.*/)\..*>
    Require all denied
</LocationMatch>

В 000-default.conf это следующая директива для защиты всего сайта через HTTP-аутентификацию.

<Location />
    AuthUserFile /var/www/site/.htpasswd
    AuthName "Restricted Area"
    AuthType Basic
    Require valid-user
</Location>

Теперь, когда я вошел в систему <LocationMatch ^(.*/)\..*> полностью игнорируется. Я пробовал это с:

<Location />
    ...
    Satisfy all
</Location>

.. безуспешно :(

Проблема действительно возникает, как указывает @HBruijn, в том, как Apache объединяет разные разделы, и в трудностях, возникающих из-за смешивания ограничений на основе файловой системы (например, <Directory> и <Files>) и на основе пути URI (например, <Location>. Безопаснее и проще использовать одно, а не то и другое вместе, потому что одно может полностью перекрыть другое.

Так, например, в Apache v2.4, если вы используете Directory вместо того Location в приведенном выше примере и используйте FilesMatch запретить доступ к файлам с ведущими ., он должен работать. Но если вы попытаетесь использовать Location для обоих, этого не произойдет.

Пример:

<FilesMatch "^\..+$">
  require all denied
</FilesMatch>

<Directory /path/to/your/docroot>
  AuthUserFile /var/www/site/.htpasswd
  AuthName "Restricted Area"
  AuthType Basic
  Require valid-user
</Directory>

Обратите внимание, что на странице @HBruijn на самом деле есть предупреждение, чтобы не пытаться использовать <Location> блоки для ограничения доступа к файлам в файловой системе под Что использовать Когда раздел.