У меня есть субдомен с index.php в корне. Я хочу заблокировать доступ к https://SUB.example.com/index.php
или любые другие популярные файлы, позволяя любому, у кого есть полный URL-адрес, получить доступ к файлам (например, другой index.php в подпапке этого поддомена)
Я хотел бы сделать это в моей конфигурации виртуального хоста вместо .htaccess, потому что эта же папка используется другим поддоменом.
Я использую Apache 2.4 под Debian Buster
Использовать LocationMatch
директива, которая позволяет указывать регулярное выражение в качестве местоположения, например:
<VirtualHost *:80>
ServerName your.server.name
(...)
<LocationMatch "^/[^/]*">
Require all denied
</LocationMatch>
</VirtualHost>
Это заблокирует любой доступ, который начинается с /
, но не содержит /
знаки, поэтому все в корневом веб-каталоге будет заблокировано, но любой путь под ним будет разрешен. Параметры не считаются частью пути, поэтому вызов /index.php?/blah
также будет отказано.
Однако если AcceptPathInfo
является On
или Default
, то пути вроде /index.php/blah
будет принято и приведет к синтаксическому анализу php
файл (фактически, таким образом будут обслуживаться любые скрипты, обработчики которых принимают запросы PATH_INFO). Если это не то, что вы хотите, вы можете отключить AcceptPathInfo
, но это может привести к некорректному поведению страниц PHP. Лучшее решение - явный отказ от файлов php в корневом каталоге (этот фрагмент конфигурации следует использовать после приведенного выше):
<LocationMatch "^/[^/]*\.php.*">
Require all denied
</LocationMatch>
Есть несколько способов ограничить доступ к определенному пути, но вот один пример:
Используйте <Location>
тег. Например:
<VirtualHost "*:80">
DocumentRoot "/path/to/blah"
ServerName blah.blah.blah
<Location "/somepath">
Require all denied
</Location>
</VirtualHost>
Вы также можете использовать Redirect
вариант в локации, если вы хотите указать клиенту более информативное место:
Redirect 403 /somepath /some-nice-message.html