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

Как заблокировать доступ к корневым файлам субдомена с помощью Apache?

У меня есть субдомен с 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