Отказать от всех в подкаталоге 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$