2 votes

Bloquer les demandes commençant par une chaîne de caractères

Je souhaite bloquer toutes les demandes commençant par /search?q= car ils génèrent une charge indésirable sur mon serveur.

Suite à cette question https://stackoverflow.com/questions/4640807/how-to-block-bot-requests-to-urls-that-match-a-common-pattern-in-apache J'ai essayé le code suivant :

<Location />
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/search?q=[^/] [NC]
RewriteRule ^.*$ - [F,L]
</Location>

mais il bloque beaucoup trop d'URLs (comme tout ce qui commence par search)

J'ai essayé différentes variantes, mais elles n'ont pas fonctionné. Quelle serait la syntaxe correcte ?

2voto

MrWhite Points 11269

mais il bloque beaucoup trop d'urls (comme tout ce qui commence par search)

Le code que vous avez posté ne le fait pas ? En fait, il est peu probable que le code que vous avez posté bloque quoi que ce soit, à moins qu'il n'y ait une URL codée ? (ie. %3F ) dans l'URL de la requête originale ?

Cependant, afin de faire correspondre la chaîne de requête (ie. q= ), il faut alors faire une correspondance avec le QUERY_STRING variable du serveur. La variable REQUEST_URI La variable du serveur Apache contient uniquement le chemin d'accès à l'URL (pas de chaîne de requête).

Ainsi, pour bloquer toutes les demandes qui commencent par /search?q= vous aurez besoin de quelque chose comme ce qui suit :

RewriteCond %{QUERY_STRING} ^q=
RewriteRule ^/?search$ - [F]

Cela permet de s'assurer que le chemin d'accès à l'URL correspond à /search et la chaîne de requête commence par q= .

En NC n'est pas nécessaire, à moins que vous ne deviez également faire correspondre l'indicateur Q= dans la chaîne de requête.

En L n'est pas nécessaire avec l'option F comme cela est sous-entendu.

UDPATE : J'ai placé ces directives directement dans la configuration du serveur, car j'ai plusieurs hôtes virtuels (sites web) sur ce serveur et j'aimerais que cette règle s'applique à tous.

C'est probablement votre problème. Les directives mod_rewrite dans la configuration du serveur sont remplacées par défaut par l'hôte virtuel et sont en fait ignorées. Les serveurs virtuels n'hériteront pas des directives mod_rewrite de la configuration du serveur à moins que vous n'activiez spécifiquement l'héritage mod_rewrite, ce que vous feriez normalement à partir du conteneur du serveur virtuel. Cependant, sur Apache 2.4.8+, vous pouvez le faire dans la configuration principale du serveur ( serveur contexte). Par exemple :

RewriteOptions InheritDownBefore

InheritDownBefore garantit que les directives de la configuration du serveur sont exécutées antes de les directives dans le serveur virtuel.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X