Comment utiliser .htaccess pour répondre avec un statut 403 interdit aux URL contenant une chaîne de requête?
Certains bots ont exploré mon site pour chaque lien qui se termine par:
?utm_source=dlvr.it&utm_medium=Twitter
Je n'ai pas vérifié son adresse IP.
Ensuite, les autres robots (10+) suivent les règles de liens ?utm_source=dlvr.it&utm_medium=Twitter
et explorent également mon site. Cela entraîne une énorme quantité de trafic, ce qui provoque la fermeture de mon site. J'ai ajouté plus de 10 autres robots à ma liste noire avec un code de statut HTTP 403
lorsqu'ils accèdent à mon site.
Mais je pense que le meilleur moyen est de trouver le premier bot qui a exploré mon site pour chaque lien qui se termine par:
?utm_source=dlvr.it&utm_medium=Twitter
Ou utilisez un code d'état de redirection HTTP 403
lorsque l'URL contient:
?utm_source=dlvr.it&utm_medium=Twitter
Je connais des façons d'ajouter . Htaccess du code qui empêcherait quelqu'un d'explorer ma page xmlrpc.php
, telle que:
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
Mais qu'en est-il d'une requête dans une URL?
Si vous avez le module mod_rewrite installé, vous pouvez le mettre dans votre fichier .htaccess dans le dossier racine de votre site Web (qui est généralement le dossier public_html
):
RewriteEngine On
RewriteRule ^\?utm_source\=dlvr.it\&utm_medium\=Twitter$ - [R=403,NC,L]
Vous devrez peut-être supprimer le \
du =
, je ne me souviens pas si égal doit échapper.
Une autre solution serait la suivante: si vous recherchez la chaîne n’importe où dans l’URL:
RewriteEngine On
RewriteRule ^(.*)\?utm_source\=dlvr.it\&utm_medium\=Twitter(.*)$ - [R=403,NC,L]
Le NC
à la fin signifie que la casse n'est pas sensible. Ainsi, si le texte est tout en majuscule, les robots seront alors dirigés vers une erreur 403
.
? utm_source = dlvr.it & utm_medium = Twitter
utm_source
et utm_medium
sont utilisés par Google Analytics (et éventuellement d'autres outils de suivi) pour surveiller les campagnes. Par conséquent, bloquer l'accès uniquement sur cette chaîne de requête ne "semble pas juste", toutefois, si cela est correct dans votre cas. alors ok...
Un point important à comprendre avec chaînes de requête est qu'elles ne peuvent pas être comparées à l'aide de la variable RewriteRule
de mod_rewrite (ou à l'aide de la variable Request_URI
dans mod_setenvif - comme suggéré dans les commentaires). La chaîne de requête est supprimée du chemin URL before elle est comparée au modèle RewriteRule
.
Activez le moteur de réécriture (mod_rewrite) si ce n'est déjà fait:
RewriteEngine On
Vous devez utiliser la directive RewriteCond
. Donc, afin de servir un "403 Interdit" pour toutes les demandes qui correspondent à la chaîne de requête ci-dessus, vous pouvez utiliser quelque chose comme:
RewriteCond %{QUERY_STRING} =utm_source=dlvr.it&utm_medium=Twitter
RewriteRule .* - [F]
Ceci est une correspondance exacte pour la chaîne de requête spécifiée (ce n'est pas une regex, le point n'a donc pas besoin d'être échappé). L’indicateur L
n’est pas requis pour spécifier l’indicateur F
(c’est implicite). (F
est un raccourci pour R=403
.)
Si vous avez besoin que cela soit moins restrictif et que toutes les chaînes de requête commençant par la chaîne de requête ci-dessus correspondent, utilisez une expression régulière:
RewriteCond %{QUERY_STRING} ^utm_source=dlvr\.it&utm_medium=Twitter
RewriteRule .* - [F]
Vous pouvez également rendre la regex insensible à la casse en utilisant l'indicateur NC
(NOCASE
). Cependant, ne l'utilisez que si vous voulez spécifiquement ignorer la casse dans la correspondance. Les gens ont tendance à ajouter ce drapeau par habitude. Cependant, il est souvent inutile (voire même incorrect) et rend le travail du moteur des expressions rationnelles encore plus difficile.
Ce n'est pas particulièrement efficace puisque chaque demande sera traitée. Si, par exemple, seules les URL situées dans le chemin /path/to/files
sont ciblées, vous pouvez rendre le modèle RewriteRule
plus restrictif:
RewriteRule ^path/to/files/ - [F]