воскресенье, 24 января 2021 г.

Особенности работы с переменными (ENV) в .htaccess Apache

Некоторые интересные нюансы (в примерах) условной установки/удаления переменных, разрешения/запрещения доступа в зависимости от этого.

Установка/удаление переменных

Установка переменной в зависимости от user-agent

SetEnvIfNoCase User-Agent google AllowGroup

Переменная AllowGroup будет установлена (значение "1"), если User-Agent содержит "google", независимо от регистра.
Кавычки необязательны, если последовательность символов ("google") не содержит пробелов.

Установка переменной в зависимости от гео данных

(если на сервере установлено расширение GeoIP)

Примеры зависимости от континента, страны, региона, города :)

SetEnvIfNoCase GEOIP_CONTINENT_CODE "EU" AllowGroup
SetEnvIfNoCase GEOIP_COUNTRY_CODE "RU" AllowGroup
SetEnvIfNoCase GEOIP_REGION_NAME "Kyyiv" DisallowGroup # Kyyivs'ka Oblast
SetEnvIfNoCase GEOIP_CITY "Kyiv" DisallowGroup # Kyyiv

Удаление переменной (своего рода unset)

SetEnvIfNoCase User-Agent unwanted_bot !AllowGroup

Переменная AllowGroup будет очищена, если User-Agent содержит "unwanted_bot", независимо от регистра.
Ставится восклицательный знак перед именем переменной, которую надо удалить. Если быть более точным, можно сказать, что переменная не удаляется, а ей устанавливается значение "" (пустая строка) вместо "1". Это стоит учитывать при проверках, установлена или нет такая переменная.

Одновременно несколько переменных

Можно устанавливать одновременно несколько переменных. Или очищать. Или одни устанавливать, другие - очищать.

SetEnvIfNoCase Remote_Addr 127.0.0.1 DisallowGroup !AllowGroup

В данном примере для посетителя с IP адресом 127.0.0.1 будет установлена переменная DisallowGroup и очищена переменная AllowGroup.

Установка переменной в зависимости от IP адреса

SetEnvIfNoCase Remote_Addr 18.27.197.252 DisallowGroup

Для посетителя с указанным IP адресом (адрес вымышлен, случайные цифры) будет установлена переменная DisallowGroup.

Или по части IP адреса (сразу подсеть):

SetEnvIfNoCase Remote_Addr ^18.27.197. DisallowGroup
SetEnvIfNoCase Remote_Addr ^18.27.[12] DisallowGroup

Установка переменной в зависимости от Cookie

SetEnvIfNoCase Cookie "exAcs=a" AllowGroup

Если строка с куками содержит указанную последовательность символов (то есть кука exAcs равняется "a"), будет установлена переменная AllowGroup.

Установка переменной в зависимости от реферера

(сайта, с которого перешли на наш сайт)

SetEnvIfNoCase ^Referer$ (yandex.|google.|mail.ru|bing.com) AllowGroup

В данном примере для посетителей, которые перешли с указанных поисковиков, для этой загрузки этой страницы будет установлена переменная AllowGroup.

Очистить (удалить) переменную в зависимости от другой переменной

Переменные можно устанавливать/очищать в зависимости от других переменных.

SetEnvIfNoCase AllowGroup ^$ !MK_74

В данном примере: если переменная AllowGroup пустая (не установлена), тогда очистить переменную MK_74.

Проверка переменных для перенаправления

Проверка для редиректа, если переменная установлена

RewriteCond %{ENV:AllowGroup} 1
RewriteRule ...

Проверка для редиректа, если переменная не установлена

RewriteCond %{ENV:AllowGroup}^$
RewriteRule ...

По сути, это проверка на пустое значение.

Использование переменных в ограничении доступа

Запретить всем, кроме разрешенных

Order Deny,Allow
Deny from all
Allow from env=AllowGroup

Доступ будет разрешен только посетителям, кому выше присвоена переменная AllowGroup.

Разрешить всем, но некоторым запретить

Order Allow,Deny
Allow from all
Deny from env=!AllowGroup env=DisallowGroup

Запрещаем доступ тем, у кого AllowGroup не установлена или DisallowGroup установлена.

Комбинированный вариант

Order Allow,Deny
Allow from env=AllowGroup
Deny from env=!AllowGroup env=DisallowGroup

 

Как видите, возможности - очень даже ничего! )
Не забудьте отписаться в комментариях, если нашли тут для себя что-то полезное или интересное!

 

Кстати, о полезном: 

Apache Module mod_setenvif

 

Комментариев нет:

Отправка комментария