web-dev-qa-db-ja.com

名前にスペースがあるユーザーエージェントをブロックする方法は?

クローラーから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;
}

だから、これの代替は何ですか?これらのスパムボットに私のウェブサイトをクロールさせたくありません。どんな答えでも大歓迎です。

2
Mina Hafzalla

一般的な正規表現コードが間違っています。

代わりに次のようなものを試してください:

RewriteCond %{HTTP_USER_AGENT} (.*Baiduspider.*|.*DV.*CRAWLER.*) [NC]

パイプ文字()で区切られたカッコ|の間の各反復で文字列と照合しますが、.*はすべてに一致するワイルドカードです。オプションで、スペースに\ sまたは\ s +を使用できますが、.*も機能し、より良い場合があります。 DV CRAWLER文字列がどのように見えるかわからないので、推測しました(Swag)。これを調整する必要がある場合があります。

例:通りを走る赤い車の列の文字列は、.*red.*cars.*を使用して単純に一致させることができます。これには、より洗練された正規表現がありますが、この単純な方法を使用すると、安全に何度も繰り返すことができます。

1
closetnoc

スペースは.htaccessの区切り文字(特殊文字)であるため、正規表現のリテラルスペースに一致させる場合は、バックスラッシュをエスケープする必要があります。例えば。 DV\ CRAWLER。 (それ以外の場合は、500内部サーバーエラーが発生する可能性が低くなります。)

または、任意の空白文字(スペース、タブ、または改行/改行)に一致する簡略文字クラス\sを使用できます-技術的には単なるスペースではありません。

3
MrWhite

疑わしい場合は、正規表現に括弧とエスケープを追加します。最初にこれを試してください:

(Baiduspider|(DV CRAWLER))

あなたの問題は、あなたが括弧を持たないときに「バイダスパイダーまたはDVに続いてクローラー」と評価されることだと思います。それでもうまくいかない場合は、スペースをエスケープしてみてください。

(Baiduspider|(DV\sCRAWLER))

\sは空白文字です。

1