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.