Spec-Zone.ru › Apache HTTP Server

Использование 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API