Использование 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" localreferer <FilesMatch "\.(jpg|png|gif)$"> Require 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" goaway <Location "/secret/files"> <RequireAll> Require all granted Require not env goaway </RequireAll> </Location>Как отмечалось выше, этот метод легко обойти, просто изменив заголовок запроса
USER_AGENT. Если вы подвергаетесь продолжительной атаке, рассмотрите возможность блокировки на более высоком уровне, например на брандмауэре.
Запрет доступа для узлов из списка блокировки
- Описание:
-
Мы хотим поддерживать список узлов, подобный
hosts.deny, и блокировать этим узлам доступ к нашему серверу. - Решение:
-
RewriteEngine on RewriteMap hosts-deny "txt:/path/to/hosts.deny" RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR] RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "-" [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
- Описание:
-
Перенаправление запросов в зависимости от Referer, с которого поступил запрос; для каждого Referer используется отдельный целевой адрес.
- Решение:
-
Следующий набор правил использует файл карты, чтобы сопоставить каждый Referer с целевым адресом перенаправления.
RewriteMap deflector "txt:/path/to/deflector.map" RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}}" "=-" RewriteRule "^" "%{HTTP_REFERER}" [R,L] RewriteCond "%{HTTP_REFERER}" !="" RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND" RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]В файле карты для каждого Referer перечислены целевые адреса перенаправления. Если же мы хотим перенаправить пользователя обратно туда, откуда он пришёл, в карте указывается «-»:
## ## deflector.map ## 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/
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/rewrite/access.html