Как я могу использовать.htaccess для ответа со статусом 403 запрещено для URL-адресов, содержащих строку запроса?
Некоторые боты сканировали мой сайт по каждой ссылке, которая заканчивается:
?utm_source=dlvr.it&utm_medium=twitter
Я не проверял его IP-адрес.
Затем другие боты (10+) следуют правилам ссылок ?utm_source=dlvr.it&utm_medium=twitter
и также сканируют мой сайт. Это приводит к огромному объему трафика, который затем приводит к закрытию моего сайта. Я добавил 10+других ботов в свой черный список с кодом статуса HTTP 403
, когда они заходят на мой сайт.
Но я думаю, что лучший способ - это узнать первого бота, который прополз мой сайт для каждой ссылки, которая заканчивается:
?utm_source=dlvr.it&utm_medium=twitter
Или используйте код состояния перенаправления HTTP 403
, если URL содержит:
?utm_source=dlvr.it&utm_medium=twitter
Я знаю несколько способов добавить .htaccess код, который предотвратил бы обход моей страницы xmlrpc.php
, например:
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Но как насчет запроса в URL?
2 answers
Если у вас установлен модуль mod_rewrite, то вы можете поместить его в свой файл .htaccess в корневой папке вашего веб-сайта (обычно это папка public_html
):
RewriteEngine On
RewriteRule ^\?utm_source\=dlvr.it\&utm_medium\=twitter$ - [R=403,NC,L]
Возможно, вам придется удалить \
из =
, я не могу вспомнить, нужно ли экранировать equals.
Другим способом было бы следующее, если вы ищете строку в любом месте URL-адреса:
RewriteEngine On
RewriteRule ^(.*)\?utm_source\=dlvr.it\&utm_medium\=twitter(.*)$ - [R=403,NC,L]
NC
в конце означает, что регистр не чувствителен, поэтому, если текст весь в верхнем регистре, то боты будут направлены на ошибку 403
.
?utm_source=dlvr.it&utm_medium=твиттер
utm_source
и utm_medium
используются Google Analytics (и, возможно, другими трекерами) для мониторинга кампаний, поэтому блокировка доступа исключительно по этой строке запроса "не кажется правильной", однако, если это правильно в вашей ситуации, тогда хорошо...
Важный момент, который следует учитывать при использовании строк запроса , заключается в том, что они не могут быть сопоставлены только с помощью RewriteRule
mod_rewrite (или с помощью переменной Request_URI
в mod_setenvif -as предложено в комментариях). Строка запроса удаляется из URL-пути до того, как будет сопоставлена с шаблоном RewriteRule
.
Включите механизм перезаписи (mod_rewrite), если это еще не сделано:
RewriteEngine On
Вам необходимо использовать директиву RewriteCond
. Итак, чтобы обслуживать "403 Запрещено" для всех запросов, которые соответствуют приведенной выше строке запроса, вы можете использовать что-то вроде:
RewriteCond %{QUERY_STRING} =utm_source=dlvr.it&utm_medium=twitter
RewriteRule .* - [F]
Это точное соответствие указанной строке запроса (это не регулярное выражение, поэтому точка не нуждается в экранировании). Флаг L
не требуется при указании флага F
(он подразумевается). (F
является сокращением для R=403
.)
Если вам нужно, чтобы он был менее строгим и соответствовал всем строкам запроса, которые начинаются с приведенной выше строки запроса, используйте регулярное выражение:
RewriteCond %{QUERY_STRING} ^utm_source=dlvr\.it&utm_medium=twitter
RewriteRule .* - [F]
Вы также можете сделать регулярное выражение нечувствительным к регистру, используя NC
(NOCASE
) флаг. Однако используйте это только в том случае, если вы специально хотите игнорировать регистр в матче. Люди склонны добавляйте этот флаг по привычке, однако, это часто не нужно (или иногда даже неправильно) и просто усложняет работу механизма регулярных выражений.
Это не особенно эффективно, так как каждый запрос будет обработан. Если, например, нацелены только URL-адреса в пути /path/to/files
, вы можете сделать шаблон RewriteRule
более ограничительным:
RewriteRule ^path/to/files/ - [F]