web-dev-qa-db-ja.com

htaccessの空のリファラーは「google bot」を拒否します

  1. このルールをhtaccessファイルに入れて、403を返す空のリファラーを拒否します

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

    ログを見ることができますが、空のリファラーとしても機能しているGooglebotも拒否しています。 Googlebotのアクセスを許可し、残りの空のリファラーをすべて拒否するようにルールを変更する方法はありますか?

  2. を使用して1つのリファラーwww.example.comをブロックしました

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

    403を返しますが、example.com/another_pageから参照している場合はどうでしょうか。

    だから私はこれをやった:

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

    それが正しいか?

  3. このユーザーエージェントをブロックするにはどうすればよいですか:Mozilla/5.0/Firefox/42.0 - nbertaupete95(at)gmail.com?ルールはどのように見えるべきですか?これは機能しますか?

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

発見した(およびコメントで警告された)ように、空のRefererヘッダーを含む要求をブロックしようとしないでください。 Google(およびほとんどのボット)と多くの正当なユーザーはHTTP Refererヘッダーを送信しません(少なくともある時点で)ので、これは問題を引き起こすだけです。

質問の残りの2つのクエリに回答するには...

  1. を使用して1つのリファラーwww.example.comをブロックしました

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

    403を返しますが、example.com/another_pageから参照している場合はどうでしょうか。

既存のディレクティブを変更する必要はありません。最初のRewriteCondディレクティブは、単純に含むexample.comのリファラーをすでにブロックしています。 example\.comは正規表現(正規表現)であることに注意してください(これがドットがバックスラッシュでエスケープされる理由です)。 anchorsがない場合、パターンはHTTP_REFERER内のどこでも自然に一致します。

(ただし、追加のディレクティブexample/another_page\.com/の-​​パターンは少しマッシュであるため、意図したとおりに一致することはありません。それは問題ではありません。とにかく最初のconditionにマッチします。)

  1. このユーザーエージェントをブロックするにはどうすればよいですか:Mozilla/5.0/Firefox/42.0 - nbertaupete95(at)gmail.com?ルールはどのように見えるべきですか?これは機能しますか?

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

いいえ、これは機能しません。正規表現は正しくありません。正規表現で文字列の開始anchor^)を導入したため、start "nbertaupete95 ..."のユーザーエージェントのみに一致します。指定されたユーザーエージェント文字列では、この部分文字列は内に含まれる itです。

また、括弧((および))は正規表現の特別なメタ文字です。これらはalternationおよびサブパターンをキャプチャするために使用されます。リテラルの括弧と一致させるには、これらをバックスラッシュでエスケープする必要があります。 \(

したがって、代わりに次のような例を読む必要があります。

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

Lフラグを使用する場合、Fフラグは必要ありません(暗黙的です)。 _CondPattern_NCフラグも不要です。ただし、このユーザーエージェントが実際に大文字と小文字の違いを持っ​​ている場合を除きますか?また、ドットは、以前のディレクティブで行ったように、リテラルドットと一致するようにエスケープする必要があります。

指定されたユーザーエージェントでは、「メールアドレス」はユーザーエージェントの最後にあります。この場合は、文字列の終わりanchor$)を正規表現に追加できます(例:nbertaupete95\(at\)gmail\.com$)。

1
MrWhite