| Раздел 4. Руководство по перезаписи URL
Пункт 37. Использование mod_rewrite для управления доступом Этот документ дополняет mod_rewrite
справочную документацию. В нем описывается, как вы можете использовать mod_rewrite для управления доступом к различным ресурсам, и другие связанные с этим методы. Это включает в себя множество примеров общего использования mod_rewrite, включая подробное описание того, как каждый из них работает.
Обратите внимание, что многие из этих примеров не будут работать без изменений в вашей конкретной конфигурации сервера, поэтому важно, чтобы вы их поняли, а не просто вырезали и вставляли примеры в свою конфигурацию.
Запрещение «хотлинкинга» изображения
- Описание:
-
Следующий метод запрещает другим сайтам размещать ваши изображения на своих страницах. Эту практику часто называют «хотлинкингом», и она приводит к тому, что ваша пропускная способность используется для предоставления контента для чужого сайта.
- Решение:
-
Этот метод основан на значении переменной
HTTP_REFERER , которая не является обязательной. Таким образом, некоторые люди могут обойти это ограничение. Однако большинство пользователей столкнется с неудачным запросом, что со временем должно привести к удалению изображения с этого другого сайта.
Есть несколько способов справиться с этой ситуацией.
В этом первом примере мы просто отклоняем запрос, если он не был инициирован со страницы нашего сайта. Для целей этого примера мы предполагаем, что наш сайт www.example.com .
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]
Во втором примере вместо отказа от запроса мы отображаем альтернативное изображение.
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png" [R,NC]
В третьем примере мы перенаправляем запрос на изображение на каком-то другом сайте.
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif" [R,NC]
Из этих методов последние два, как правило, наиболее эффективны для того, чтобы заставить людей прекратить хотлинковать ваши изображения, потому что они просто не увидят изображение, которое ожидали увидеть.
- Обсуждение:
-
Если все, что вы хотите сделать, это запретить доступ к ресурсу, а не перенаправлять этот запрос в другое место, это можно сделать без использования mod_rewrite:
SetEnvIf Referer "example\.com" локальный реферер
<FilesMatch "\.(jpg|png|gif)$">
Требовать env localreferer
</FilesMatch>
Блокировка роботов
- Описание:
-
В этом рецепте мы обсуждаем, как заблокировать постоянные запросы от определенного робота или пользовательского агента.
Стандарт исключения роботов определяет файл,
/robots.txt в котором указаны те части вашего веб-сайта, где вы хотите исключить роботов. Однако некоторые роботы не соблюдают эти файлы.
Обратите внимание, что существуют методы достижения этого, которые не используют mod_rewrite. Также обратите внимание, что любой метод, основанный на USER_AGENT строке клиента, можно очень легко обойти, поскольку эту строку можно изменить.
- Решение:
-
Мы используем набор правил, определяющий защищаемый каталог и клиент USER_AGENT , определяющий вредоносного или постоянного робота.
В этом примере мы блокируем робота, вызываемого
NameOfBadRobot из местоположения
/secret/files . Вы также можете указать диапазон IP-адресов, если вы пытаетесь заблокировать этот пользовательский агент только из определенного источника.
RewriteCond "%{HTTP_USER_AGENT}" "^NameOfBadRobot"
RewriteCond "%{REMOTE_ADDR}" "=123\.45\.67\.[8-9]"
RewriteRule "^/secret/files/" "-" [F]
- Обсуждение:
-
Вместо того, чтобы использовать для этого mod_rewrite, вы можете добиться той же цели, используя альтернативные средства, как показано здесь:
SetEnvIfNoCase User-Agent "^NameOfBadRobot" уходит
<Расположение "/секрет/файлы">
<ТребоватьВсе>
Требовать все предоставленные
Не требовать env goaway
</RequireAll>
</местоположение>
Как отмечалось выше, эту технику легко обойти, просто изменив USER_AGENT заголовок запроса. Если вы столкнулись с продолжительной атакой, вам следует заблокировать ее на более высоком уровне, например, на брандмауэре.
Отказ хостов в черном списке
- Описание:
-
Мы хотим вести черный список хостов, например
hosts.deny , и заблокировать этим хостам доступ к нашему серверу.
- Решение:
-
RewriteEngine включен
RewriteMap hosts-deny "txt:/path/to/hosts.deny"
RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [ИЛИ]
RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
Правило перезаписи "^" "-" [F]
##
## hosts.deny
##
## ATTENTION! This is a map, not a list, even when we treat it as such.
## mod_rewrite parses it for key/value pairs, so at least a
## dummy value "-" must be present for each entry.
##
193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -
- Обсуждение:
-
Второй RewriteCond предполагает, что у вас включен HostNameLookups, поэтому IP-адреса клиентов будут разрешены. Если это не так, вы должны удалить второй RewriteCond и снять флаг
[OR] с первого RewriteCond.
Дефлектор на основе рефералов
- Описание:
-
Перенаправление запросов на основе реферера, от которого пришел запрос, с разными целями для каждого реферера.
- Решение:
-
В следующем наборе правил используется файл карты, чтобы связать каждого Referer с целью перенаправления.
Дефлектор RewriteMap "txt:/path/to/deflector.map"
Переписать условие "%{HTTP_REFERER}" !=""
RewriteCond "${дефлектор:%{HTTP_REFERER}}" "=-"
RewriteRule "^" "%{HTTP_REFERER}" [R,L]
Переписать условие "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]
В файле карты перечислены цели перенаправления для каждого реферера, или, если мы просто хотим перенаправить обратно туда, откуда они пришли, на карту ставится «-»:
##
## дефлектор.карта
##
http://badguys.example.com/bad/index.html –
http://badguys.example.com/bad/index2.html –
http://badguys.example.com/bad/index3.html http://somewhere.example.com/
|
 |