web-dev-qa-db-fra.com

Le référent vide htaccess nie "google bot"

  1. Je mets cette règle dans un fichier htaccess pour refuser les référents vides qui renvoie 403

    SetEnvIfNoCase Referer "^$" bad_user  
    Deny from env=bad_user
    

    Je peux voir le journal, il nie aussi Googlebot qui agit également comme référent vide. Existe-t-il un moyen de modifier la règle pour autoriser l'accès à Googlebot et refuser tous les autres référents vides?

  2. J'ai bloqué un référent www.example.com en utilisant

    RewriteCond %{HTTP_REFERER} example\.com [NC]  
    RewriteRule .* - [F]
    

    Cela fonctionne bien, en retournant 403, mais que se passe-t-il s'il fait référence à example.com/another_page?

    Alors j'ai fait ça:

    RewriteCond %{HTTP_REFERER} example\.com [NC,OR]  
    RewriteCond %{HTTP_REFERER} example/another_page\.com/ 
    RewriteRule .* - [F]
    

    Est-ce correct?

  3. Comment puis-je bloquer cet agent d'utilisateur: Mozilla/5.0/Firefox/42.0 - nbertaupete95(at)gmail.com? À quoi devrait ressembler la règle? Est-ce que celui-ci fonctionnera?

    RewriteCond %{HTTP_USER_AGENT} ^nbertaupete95(at)gmail.com [NC]  
    RewriteRule .* - [F,L]
    
2
Michael Kowalski

Comme vous l'avez constaté (et mis en garde dans les commentaires), vous ne devez pas essayer de bloquer les demandes contenant un en-tête vide Referer. Google (et la plupart des robots) et de nombreux utilisateurs légitimes n'enverront pas l'en-tête HTTP Referer (du moins à un moment donné), ce qui ne vous posera que des problèmes.

Pour répondre aux deux questions restantes de votre question ...

  1. J'ai bloqué un référent www.example.com en utilisant

    RewriteCond %{HTTP_REFERER} example\.com [NC]  
    RewriteRule .* - [F]
    

    Cela fonctionne bien, en retournant 403, mais que se passe-t-il s'il fait référence à example.com/another_page?

Vous n'avez pas besoin de changer quoi que ce soit à vos directives existantes. La première directive RewriteCond bloque déjà tout référent qui simplement contientexample.com. Notez que example\.com est une expression rationnelle (expression régulière) (c'est pourquoi le point est un caractère d'échappement avec barre oblique inversée). Sans aucun ancres, le motif est naturellement apparié n'importe où dans le HTTP_REFERER.

(Cependant, le motif dans votre directive supplémentaire example/another_page\.com/ est un peu en purée de toute façon, donc ne correspondrait jamais comme prévu. Cela n'aurait pas eu d'importance, car aura apparié le premier condition de toute façon.)

  1. Comment puis-je bloquer cet agent d'utilisateur: Mozilla/5.0/Firefox/42.0 - nbertaupete95(at)gmail.com? À quoi devrait ressembler la règle? Est-ce que celui-ci fonctionnera?

    RewriteCond %{HTTP_USER_AGENT} ^nbertaupete95(at)gmail.com [NC]
    RewriteRule .* - [F,L]
    

Non, cela ne fonctionnerait pas, la regex n'est pas correcte. Vous avez introduit un début de chaîne anchor (^) sur la regex, de sorte que seuls les agents utilisateurs qui start "nbertaupete95 ..." seront recherchés. Dans la chaîne user-agent indiquée, cette sous-chaîne est incluse dans elle.

De plus, les parenthèses (( et )) sont des méta-caractères spéciaux dans les expressions rationnelles - elles sont utilisées pour alternance et pour capturer les sous-modèles. Pour faire correspondre une parenthèse littérale, celles-ci doivent être des barres obliques inverses, par exemple. \(.

Votre exemple devrait donc se lire comme suit:

RewriteCond %{HTTP_USER_AGENT} nbertaupete95\(at\)gmail\.com
RewriteRule .* - [F]

L’indicateur L n’est pas requis lorsque vous utilisez F (c’est implicite). Le drapeau NC sur le _CondPattern_ est également inutile, sauf si cet agent utilisateur a réellement une différence de casse? De plus, les points doivent être échappés pour correspondre à un point littéral, comme vous l'avez fait dans vos directives précédentes.

Dans l'agent d'utilisateur indiqué, "l'adresse e-mail" apparaît à la fin de l'agent d'utilisateur. Si tel est le cas, vous pouvez ajouter une fin de chaîne ancre ($) à l'expression régulière, par exemple: nbertaupete95\(at\)gmail\.com$.

1
MrWhite