Xserverで特定のbotのアクセスを遮断する
User-Agentに含まれるbot独自の文字列を含んでいるかどうかで、アクセスを拒否する数行のコードを.htaccessに追記します。403を返すだけになるので帯域の節約になります。
目次
大前提ですが、自己責任でお願いします。
Bytespiderというbotのアクセスが多発していた
Xserverのアクセス解析を見ていたら、Bytespiderというbotがえげつなくアクセスしてきていて邪魔に思えたので、.htaccessを編集してBytespiderからのアクセスには403を返すようにしました。
BytespiderというbotのUser-Agentを確認すると、
Mozilla/5.0 ..省略.. (compatible; Bytespider; spider-feedback@bytedance.com)
のようになっていて、最後に記載されているbytedance.comを調べると、どうやらTikTokの親会社のようでした。
かねてから除外したかったahrefsというSEOツール系のbotと一緒にアクセスを拒否します。
結果、このように、Bytespiderに対してことごとく403を返すようになります。
www.gsx-r400.com ..省略.. 403 "Mozilla/5.0 ..省略.. Bytespider; spider-feedback@bytedance.com
.htaccessに追記するコード
このコードを.htaccessの末尾に追記します。追記する時は、追記前の正常に動作している状態の.htaccessをどこかに必ずコピペしておいて、何か異常があればいつでも戻せるようにしておいてください。
# リクエストをブロックする条件を設定
SetEnvIfNoCase User-Agent "Bytespider" block
SetEnvIfNoCase User-Agent "bytedance" block
SetEnvIfNoCase User-Agent "ahrefs" block
<RequireAll>
Require all granted
Require not env block
</RequireAll>
Xserverのサーバーパネルの「.htaccess編集」→「設定対象ドメイン」を選択→「.htaccess編集」タブを開くと.htaccessが編集できます。すでにWordPressやXserverが書き込んだ設定が書き込まれているでしょう。
その末尾に上記コードをコピペします。
このコードを簡単に解説すると、
.htaccessでは#で始まる行はコメントです。処理されません。
SetEnvIfNoCaseのSetEnvというのは、環境変数を設定する命令で、User-AgentにBytespiderが含まれていたら、そのアクセスに対してblockという環境変数をセットするという意味になります。
SetEnvIfNoCaseは、SetEnvの大文字・小文字を区別しない(NoCase)命令。BytespiderでもbyteSpiderでもbytespiderでも大文字・小文字を区別せずに含まれているかを判定します。
Require all grantedで一旦すべてのアクセスを許可しておいて、Require not env blockで環境変数(env)がblockなアクセスを拒否しています。
ご自分で他のものを追加する場合に気をつけてほしいこと
ご自分で他のものを追加する場合に気をつけてほしいのは、SetEnvは"Bytespider"のようにダブルクオートで囲んで与えられた文字を正規表現で分析するので、正規表現でエスケープが必要な文字はバックスラッシュ( \ )でエスケープしないと、すべてのアクセスが500エラーになるので注意してください。
例えば、"Safari/537.36"を含んでいるのを遮断する場合は、ピリオドが正規表現のエスケープ対象文字なので、
SetEnvIfNoCase User-Agent "Safari/537\.36" block
のように、ピリオドの前にバックスラッシュをつけます。
ちなみにこれは、私のブラウザからアクセスした時のUser-Agentをブラウザの開発ツールで調べて、その中にあった"Safari/537.36"を利用して、実際に効くのかを試した時のものです。
正規表現のエスケープが必要な文字の一覧は、外部サイトですが、このページが参考になります。
正規表現:エスケープが必要な文字一覧 | WWWクリエイターズ
私の場合の最終的な.htaccessをご参考にどうぞ
ちなみに私の場合、.htaccessは最終的にこのようになります。
今回追記する以外のコードは人によってまちまちでしょうから、このコードを全部コピペするのはご法度です。
あくまで、末尾にこのように追記するんだという見本として。
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode
SetEnvIf Request_URI ".*" AllowRestApi
SetEnvIf Request_URI ".*" AllowRestApi
SetEnvIf Request_URI ".*" AllowRestApi
# リクエストをブロックする条件を設定
SetEnvIfNoCase User-Agent "Bytespider" block
SetEnvIfNoCase User-Agent "bytedance" block
SetEnvIfNoCase User-Agent "ahrefs" block
<RequireAll>
Require all granted
Require not env block
</RequireAll>