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

.htaccess запретить / разрешить конкретную папку в моих текущих правилах

Я использую .htaccess правило, подобное приведенному ниже:

# BEGIN Disable access to all files EXCEPT
Order deny,allow
Deny from all

# Files
<Files ~ ".(doc|xlsx|xlsm|xls|pdf|docx|txt|rtf|rdf|odf)$">
    Allow from all
</Files>
# Page Content
<Files ~ ".(css|js)$">
    Allow from all
</Files>
# Images
<Files ~ ".(jpe?g|png|gif|bmp|cur|ico|webp)$">
    Allow from all
</Files>
# Fonts
<Files ~ ".(svgz?|eot|otf|tt[cf]|woff2?)$">
    Allow from all
</Files>

Однако я также хочу разрешить один конкретный .php файла, я не хочу помещать правило .htaccess в папку, где .php файл существует, поэтому я пытался сделать это с помощью FilesMatch

Вот некоторые примеры:

<FilesMatch "\/folder1\/folder2\/folder3\/folder4\/\.(php)">
    Allow from all
    Satisfy Any   
</FilesMatch>

<FilesMatch "\folder1\folder2\folder3\folder4\file1.php">
    Allow from all
    Satisfy Any   
</FilesMatch>

Я даже пробовал их с /home/hostaccount/public_html/ в начале локации, а также просто /public_html/ в начале локации.

Я пробовал добавить ^ в начало локации и закончил его $ в конце.

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

Нет большой разницы между <Files ~ "..."> или <FilesMatch "..."> (или <Files "..."> в этом контексте), поскольку все они просто совпадают с базовым именем файла, за исключением пути к каталогу.

Итак, если базовое имя файла уникальный в этом дереве каталогов вы можете просто сделать:

<Files "file-to-allow.php">
    Allow from all
</Files>

Однако это будет соответствовать file-to-allow.php везде в этом дереве каталогов, если одно и то же базовое имя файла встречается в нескольких каталогах.

Если вам нужно было сопоставить полный путь к файловой системе (или, строго говоря, URL-путь), без использования .htaccess файл в целевом подкаталоге и без доступа к конфигурации сервера (что позволит вам использовать <Directory> container), то с помощью mod_setenvif вы могли бы сделать что-то вроде следующего:

SetEnvIf Request_URI "^/path/to/file-to-allow\.php$" letmein

Allow from env=letmein

В SetEnvIf директива устанавливает переменную среды letmein если Request_URI соответствует определенному URL-адресу (регулярное выражение). Затем это используется в следующих Allow директива только позволять если установлена ​​переменная окружения.