Применение .htaccess для эффективной блокировки доступа к вашему сайту

Иногда необходимо запретить доступ к сайту с определенного IP-адреса или наоборот – открыть доступ с определенного IP-адреса, а с остальных запретить. Выполнить эту задачу можно, добавив определенные строки в файл – .htaccess. В зависимости от версии apache на вашем сервере (наш хостинг использует версии apache 2.2 и apache 2.4), синтаксис в .htaccess будет различаться. Вы можете создать универсальный .htaccess, который будет работать на обеих версиях apache (мы рассмотрим, как это делать в конце статьи). Если же вы не хотите создавать универсальный .htaccess, то можете узнать, какая версия apache стоит на вашем сервере.

Чтобы узнать версию apache, на которой работает ваш домен, создайте тестовый файл в папке domain-name.com/htdocs/www/phpinfo.php с содержимым:

<?php
    phpinfo(); 
?>

Далее переходите по ссылке domain-name.com/phpinfo.php и с помощью поиска CTRL+F ищете версию вашего apache.

Файл .htaccess обычно размещен в корневой директории /domain.ru/htdocs/www вашего сайта.

Если его там нет – необходимо его создать. Обратите внимание: имя файла начинается с точки, а файл не имеет расширения.

Загрузить файл можно при помощи FTP–клиента или Файлового менеджера в панели управлеения.

Далее рассмотрим синтаксис для разных версий apache. Вы используете тот, что стоит у вас.

Блокировка доступа к сайту по IP-адресу

Для закрытия доступа с определенного IP-адреса, добавьте следующие строки в .htaccess:

Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxxapache 2.2
<RequireAll>
Require all granted
Require not ip xxx.xxx.xxx.xxx
</RequireAll>apache 2.4

Где xxx.xxx.xxx.xxx - это IP-адрес, с которого не должно быть доступа.

Можно указать несколько значений:

Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxx
Deny from yyy.yyy.yyy.yyy
Deny from zzz.zzz.zzz.zzzapache 2.2
<RequireAll>
Require all granted
Require not ip xxx.xxx.xxx.xxx
Require not ip yyy.yyy.yyy.yyy
Require not ip zzz.zzz.zzz.zzz
</RequireAll>apache 2.4

Либо в одну строчку через пробел:

Order Allow,Deny
Allow from all
Deny from xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzzapache 2.2
<RequireAll>
Require all granted
Require not ip xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz
</RequireAll>apache 2.4

Открытие доступа к сайту по IP-адресу

Для открытия доступа с определенного IP-адреса, добавьте следующие строки

Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xxxapache 2.2
<RequireAll>
Require all denied
Require ip xxx.xxx.xxx.xxx
</RequireAll>apache 2.4

Где xxx.xxx.xxx.xxx - это IP-адрес, с которого должен быть разрешен доступ. Можно указывать несколько значений (по аналогии с примерами блокировки - каждый ip-адрес на новой строчке, либо через пробел).

Order Deny,Allow
Deny from all
Allow from xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzzapache 2.2
<RequireAll>
Require all denied
Require ip xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz
</RequireAll>apache 2.4

Блокировка доступа к сайту по IP-диапазону

Также, можно пропустить последний октет IP-адреса:

Deny from xxx.xxx.xxx.apache 2.2
Require not ip xxx.xxx.xxx.apache 2.4

Тогда будут заблокированны все IP адреса данной сети. К сожалению, чаще бывает, что злоумышленники используют не статический, а динамический IP-адрес. Поэтому, мы можем взять IP-адрес и определить подсеть с диапазоном IP, откуда он пришёл. Для этого можно использовать любой Whois сервис. Воспользуемся тем, что есть на нашем сайте

Вводим IP-адрес в строку поиска, в выдаче ищем ключ CIDR (Сlassless Inter-Domain Routing, Бесклассовая адресация) или, если его нет, NetRange и копируем его значение. Значение CIDR в общем виде будет выглядеть следующим образом: xxx.xxx.xxx.xxx/xx (суффикс /xx говорит нам, сколько битов адрес имеет в целом).

Если CIDR присутствует, то в файле .htaccess прописываем:

Order Allow,Deny
Deny from xxx.xxx.xxx.xxx/xxapache 2.2
Require all granted
Require not ip xxx.xxx.xxx.xxx/xxapache 2.4

Если же нет, то вы можете воспользоваться данным калькулятором IP-диапазона в CIDR и данными из NetRange, чтобы получить CIDR.

htaccess для разных версий apache

Для примера рассмотрим модуль mod_authz_core.c. Его нет в версии apache 2.2, но он всегда присутствует в apache 2.4. Для универсализации вашего .htaccess скрипта, в данном случае можно написать следующее:

apache 2.2 #######
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
</IfModule>

apache 2.4 #######
<IfModule mod_authz_core.c>
    Require all denied
</IfModule>