迷惑クローラーの排除・拒否方法についての解説＆よくある勘違い（初心者向け）

自分のサイトにとって何のメリットもないばかりか、時にはサイトが重くなる原因になることもある、迷惑クローラー（迷惑ボット）。

色んな情報を参考にしながら、排除・拒否する設定をしている方も多いと思いますが、意外と「勘違い」されてしまっているケースもあるようです。

--------------------------------------------------------------------------------

## 1.robots.txt での制限

「この内容を読んで理解してね」と、クローラーの良心に任せる？方法です。

つまり、せっかく書いても、**内容を読んでくれなかったり、書いている命令を無視する（解釈できない）クローラーもいる**という事になります。

```:robots.txt
User-agent: SemrushBot
Disallow: /

```

のように設定する方法が広く知られていますが、UserAgent や IP アドレスなど、**既に別の方法で拒否している場合、クローラーは `robots.txt` も読めなくなってしまう**という点が、見落とされがちです。

その場合、お行儀の悪いクローラーだと…

1. お！ `robots.txt` が（読め）ないから、全部クロールしていいんだな！！
2. でも、他の方法で拒否されていてクロールできない
3. 403(Forbidden) エラーが大量発生

…という事も起こりえます。[^1]

[^1]: ログが汚れる程度で、ほぼ実害はない場合もありますので、気にしすぎる必要はありません。

--------------------------------------------------------------------------------

### robots.txt は他の制限の対象外に

もし、`robots.txt` をクローラーに読んでもらいたいのであれば、制限の対象外にする必要があります。

例えば、`.htaccess` が利用できる場合、「`robots.txt` は何の制限もしない」という命令を、**他の制限命令の下**に書きます。

- Apache 2.2 系

```apache:.htaccess
<Files robots.txt>
    Allow from all
</Files>
```

- Apache 2.4 系

```apache:.htaccess
<Files robots.txt>
    Require all Granted
</Files>
```

--------------------------------------------------------------------------------

## .htaccess が使えない環境もある

`.htaccess` は、「Apache（アパッチ）」という Web サーバーソフトウェアで使える仕組みで、実際に使った事がある方も多いと思います。

しかし最近では、軽量＆高速に動作する「Nginx（エンジンエックス）」という Web サーバーソフトウェアが、急激にシェアを伸ばしています。

- [Webサーバの3分の1がNginxに（エキサイトニュース）](https://www.excite.co.jp/news/article/Cobs_1923985/)

WordPress のチューニングなどでも、Nginx の利用（あるいは併用）は非常に効果的です。

ただ残念ながら、**`.htaccess` は「Nginx」では使えません。**WordPress のプラグインでは、`.htaccess` が使える事を前提としているものもありますので、注意してください。

--------------------------------------------------------------------------------

## 2.htaccess での制限

### 2-1.IP アドレスで拒否

- メリット
    - サーバーに優しい（他の方法より負荷が少ない）
- デメリット
    - 何を制限したのか分かりにくい
    - IP アドレスが変わる場合がある

IP アドレスで拒否する際は特に、**`#` を使ってコメントを書く**ことを心がけると良いです。

- Apache 2.2 系

```apache:.htaccess
order Allow,Deny
Allow from all

#-- SemrushBotの拒否
deny from 46.229.160.0/20
```

- Apache 2.4 系

```apache:.htaccess
<RequireAll>
    Require all granted

    #-- SemrushBotの拒否
    Require not ip 46.229.160.0/20
</RequireAll>
```

#### IP は「単発」ではなく「範囲」を指定する

クローラーの IP アドレスが 1 つに固定されている事は稀で、通常は、複数の IP アドレスからやってきます。

上記の例では、`46.229.160.0/20` のような書き方をしていますが、これは「CIDR 表記」と呼ばれる「IP アドレスの範囲」を表現する方法です。

初心者の方は、WordPress のセキュリティ系プラグイン等でも利用されている、↓のサイトを利用すると、簡単に調べられると思います。

- https://cleantalk.org/blacklists

例えば、「46.229.168.154」で検索した結果が[コチラ](https://cleantalk.org/blacklists/46.229.168.154)です。

画面を下の方にスクロールさせると、`46.229.160.0/20` と書いてあると思いますが、これが CIDR 表記となります。

英語のページですが、初心者の方にも簡単に使えると思いますので、活用してみてください。

--------------------------------------------------------------------------------

### 2-2.HOST で拒否

- メリット
    - IP アドレスより分かりやすい
- デメリット
    - サーバーへ少し負担をかける
    - HOST が変わる場合がある（IP アドレスに比べると頻度はかなり低い）

- Apache 2.2 系

```apache:.htaccess
order Allow,Deny
Allow from all

#-- SemrushBotの拒否
deny from .semrush.com
```

- Apache 2.4 系

```apache:.htaccess
<RequireAll>
    Require all granted

    #-- SemrushBotの拒否
    Require not host .semrush.com
</RequireAll>
```

1. 46.229.168.154 の HOST は何ですか？
2. crawl26.bl.semrush.com ですよ
3. ならば拒否します

という流れになるため、サーバーへ少し負担をかけることになります。

--------------------------------------------------------------------------------

### 2-3.UserAgent で拒否

- メリット
    - 分かりやすい
- デメリット
    - サーバーへ少し負担をかける（気にしすぎる必要はない）

メンテナンスもしやすく、特に初心者の方には、一番オススメできる方法だと思います。

- Apache 2.2 系

```apache:.htaccess
SetEnvIf User-Agent "SemrushBot" deny_bot
SetEnvIf User-Agent "BLEXBot" deny_bot
SetEnvIf User-Agent "DomainCrawler" deny_bot

order Allow,Deny
Allow from all
Deny from env=deny_bot
```

- Apache 2.4 系

```apache:.htaccess
SetEnvIf User-Agent "SemrushBot" deny_bot
SetEnvIf User-Agent "BLEXBot" deny_bot
SetEnvIf User-Agent "DomainCrawler" deny_bot

<RequireAll>
    Require all Granted
    Require not env deny_bot
</RequireAll>
```

--------------------------------------------------------------------------------

## 3.ファイアウォールでの制限

```bash:CentOS6でiptablesを使う例
$ iptables -I INPUT -s 46.229.160.0/20 -j DROP
$ service iptables save
$ service iptables restart
```

サーバーの管理者権限を持っている場合は、「ターミナルソフト」と呼ばれるものを使ってサーバーへ接続し、こういったコマンドを叩いて設定します。

クラウド系のサービスなどでは、ウェブブラウザからの簡単な操作で、設定できるようになっている事もあります。

--------------------------------------------------------------------------------

### 他の方法との違い

`.htaccess` などで拒否した場合、クローラーは一度サーバーにアクセスした上で、クローリングを拒否されます。

それに対し、ファイアウォールでブロックした場合は、クローラーは**サーバーに到達する事すらできなくなる**というのが、大きな違いです。

クローラーにとって、そのサーバーは「この世に存在しないもの」として扱われる事になりますので、非常に強力な手段ですが、一般的なレンタルサーバーなどでは使えません。

もし、あまりにもお行儀の悪いクローラーに悩まされているようでしたら、サーバー管理者に相談してみてください。