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

Заблокировать доступ ко всем файлам php в подкаталоге

Мне нужно заблокировать доступ ко всем файлам .php в подкаталоге моего корневого веб-каталога. Я знаю, что могу создать .htaccess в этом подкаталоге и использовать следующее:

<FilesMatch "\.(?i:php)$">
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>

Однако для прозрачности / простоты мне действительно нужно выполнять блокировку из корневого веб-каталога .htaccess, а НЕ через подкаталог.

Если бы я заблокировал определенный файл из корневого .htaccess, я бы использовал это:

<Location /wp-includes/somefile.php>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>

Я читал, что вы не можете использовать LocationMatches в .htaccess, поэтому есть ли другой способ сделать это (без создания .htaccess для подкаталога?

ОБНОВИТЬ Кажется, что <Location> также нельзя использовать в .htaccess.

В <Location><LocationMatch>) соответствуют URL-пути, а не строго пути к файловой системе, поэтому не обязательно использовать это для управления доступом в любом случае (в конфигурации сервера).

Если у вас есть доступ к конфигурации сервера, вы должны просто использовать соответствующий <Directory> контейнер.

Без использования .htaccess в подкаталоге вы можете использовать mod_setenvif, чтобы установить переменную среды условно на основе запрошенного URL-адреса, а затем заблокировать на основе этой переменной env.

Например:

SetEnvIf Request_URI "^/subdirectory/.+\.php$" BLOCK

<IfModule !mod_authz_core.c>
  Order deny,allow
  Deny from env=BLOCK
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all granted
    Require not env BLOCK
  </RequireAll>
</IfModule>

Я перевернул Order директива (Apache 2.2), в противном случае без дополнительных Allow директива, все будет заблокировано.

Директивы Apache 2.4 должны находиться внутри <RequireAll> контейнер, сначала предоставив полный доступ (в противном случае все заблокирован), а затем условно запрещает доступ, когда BLOCK env var установлен. Вы не можете отрицать Require директива - в подразумеваемом <RequireAny> container - так как никакого эффекта не будет (фактически, это приводит к ошибке 500).

Обратите внимание, что это блокирует URL-адреса, а не строго «файлы». Он блокирует запросы, которые выглядят как .php файлы в /subdirectory - независимо от того, существуют ли они на самом деле в виде физических файлов.


В качестве альтернативы вы можете использовать mod_rewrite (Apache 2.2 и 2.4) в верхней части корневого каталога. .htaccess файл:

RewriteEngine On

RewriteRule ^subdirectory/.+\.php$ - [F]

Это просто блокирует (403 запрещено) все URL-адреса, заканчивающиеся на .php которые находятся в запрошенном /subdirectory. Если вам конкретно нужно возвращать 403 только для URL-адресов, которые сопоставляются с реальными файлами, вы можете включить дополнительное условие (хотя это, вероятно, излишне расточительно):

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^subdirectory/.+\.php$ - [F]

+ Изменить F к R=404 если вы хотите вместо этого вернуть 404.