Как я могу использовать.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?

Author: Stephen Ostermiller, 2015-02-12

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.

 4
Author: Mike -- No longer here, 2015-02-13 09:45:21

?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]
 4
Author: MrWhite, 2018-04-04 20:54:44