クローラーからDV CRAWLER
という名前のユーザーエージェントでヒットしました。これは明らかにスパムボットです。 Apacheの前でリバースプロキシとしてnginxを実行しているため、.htacessとnginxの両方の構成でブロックしようとしました。
.htaccessに使用したコードは次のとおりです。
RewriteCond %{HTTP_USER_AGENT} ^.*(Baiduspider|DV CRAWLER).*$ [NC]
RewriteRule .* - [F,L]
ユーザーエージェントの名前のスペースがコードを壊したようです。スペースのないユーザーエージェントでのみ機能することを発見しました。 nginxの場合と同じシナリオで、ユーザーエージェントの名前のスペースを受け入れず、エラーを返します。
Nginxコード:
if ($http_user_agent ~ (Baiduspider|DV CRAWLER) ) {
return 403;
}
だから、これの代替は何ですか?これらのスパムボットに私のウェブサイトをクロールさせたくありません。どんな答えでも大歓迎です。
一般的な正規表現コードが間違っています。
代わりに次のようなものを試してください:
RewriteCond %{HTTP_USER_AGENT} (.*Baiduspider.*|.*DV.*CRAWLER.*) [NC]
パイプ文字()
で区切られたカッコ|
の間の各反復で文字列と照合しますが、.*
はすべてに一致するワイルドカードです。オプションで、スペースに\ sまたは\ s +を使用できますが、.*
も機能し、より良い場合があります。 DV CRAWLER文字列がどのように見えるかわからないので、推測しました(Swag)。これを調整する必要がある場合があります。
例:通りを走る赤い車の列の文字列は、.*red.*cars.*
を使用して単純に一致させることができます。これには、より洗練された正規表現がありますが、この単純な方法を使用すると、安全に何度も繰り返すことができます。
スペースは.htaccessの区切り文字(特殊文字)であるため、正規表現のリテラルスペースに一致させる場合は、バックスラッシュをエスケープする必要があります。例えば。 DV\ CRAWLER
。 (それ以外の場合は、500内部サーバーエラーが発生する可能性が低くなります。)
または、任意の空白文字(スペース、タブ、または改行/改行)に一致する簡略文字クラス\s
を使用できます-技術的には単なるスペースではありません。
疑わしい場合は、正規表現に括弧とエスケープを追加します。最初にこれを試してください:
(Baiduspider|(DV CRAWLER))
あなたの問題は、あなたが括弧を持たないときに「バイダスパイダーまたはDVに続いてクローラー」と評価されることだと思います。それでもうまくいかない場合は、スペースをエスケープしてみてください。
(Baiduspider|(DV\sCRAWLER))
\s
は空白文字です。