Мне нужно заблокировать доступ ко всем файлам .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.