Отказать от всех в подкаталоге htaccess не переопределять правила файлов в корневом htaccess

У меня есть ситуация, когда я пытаюсь запретить доступ ко всем файлам в подкаталоге моего веб-сайта. Я добавил файл htaccess в этот подкаталог и добавил отказ от всей директивы к нему. Однако у меня также есть файл htaccess в корне сайта, который позволяет использовать определенные типы файлов, и кажется, что эти типы файлов по-прежнему доступны в подкаталоге, хотя я больше не хочу, чтобы они были. У меня есть обходное решение для этого (см. Ниже), но я чувствую, что должен быть лучший способ. Вот мои два файла htaccess:

Root.htaccess

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>

Подкаталог .htaccess

# Deny access to everything
deny from all

Обход проблемы:

Подкаталог .htaccess

# Deny access to everything
Order Allow,Deny
deny from all
<Files *.*>
    deny from all
</Files>

Это делает то, что я хочу, но я чувствую, что должен быть способ сделать отказ от всех операторов работы сам по себе. Кто-нибудь знает, как?

Ответ 1

У вас может быть ваш Root.htaccess вроде

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>

# Deny access to sub directory
<Files subdirectory/*>
    deny from all
</Files>

Нет необходимости в отдельном .htaccess в подкаталоге.

Вы разрешаете доступ ко всем html файлам в вашем .htaccess в корневой директории и не отказываетесь от нее где-либо в подкаталоге в первом случае. Apache анализирует все ваши правила и использует последнее правило сопоставления, в отличие от брандмауэров (в котором используется первое совпадение с правилом). Сначала будут прочитаны глобальные правила, а позднее - конкретные правила.

Ответ 2

Порядок директив в apache действительно не очевиден.

У вас есть полное описание его в документации Как разделены разделы.

Вот выдержка:

Порядок слияния:

  • <Directory> (за исключением регулярных выражений) и .htaccess выполняется одновременно (с .htaccess, если разрешено, переопределяет <Directory>)
  • <DirectoryMatch><Directory ~>)
  • <Files> и <FilesMatch> выполняется одновременно
  • <Location> и <LocationMatch> выполняются одновременно
  • <If>

Итак, что происходит с тем, что ваша директива <File> обрабатывается после каталогов (как .htaccess на самом деле является директивой каталога для текущего каталога).

Он работает в вашем примере, так как директивы файлов тезисов фактически вложены в директивы каталога .htaccess, а вторая директива File применяется после родительского каталога.

Вы не можете использовать директиву <FileMatch> в родительском, где файлы из подкаталога будут исключены, так как fileMatch работает только с именем файла, а не по пути к файлу. Но вы могли бы попробовать с помощью LocationMatch, но это может закончиться довольно сложным, чтобы запретить также хаки местоположения с точками.

На самом деле решением, которое я бы использовал здесь, является RedirectMatch в родительской папке:

RedirectMatch 403 ^.*\.html$