QA@IT

Apacheの設定で特定のクエリ文字列付きURLに対する検索エンジンのクロールをシャットアウトしたい

5966 PV

http://www.example.com/index.php?cmd=backup&page=hoge

上記URIのような、クエリにcmd=backupが指定されているURLに対して検索エンジンのクロールを拒否したいのです。
Livingdeadの日記: ApacheでURLのクエリ文字列によりアクセス制限を参考にして、クエリ付きURLに対してLocationMatchを効かせる方法はわかったのですが、さらに「検索エンジンのみ拒否して他は許可」する方法がわかりませんでした。

今のところ、コンフィグ(Apache2.2.22 httpd.conf VirtualHost内)は以下のようになっています。

 RewriteEngine On
 RewriteCond %{QUERY_STRING} cmd=backup
 RewriteRule /index.php /index.php [E=BACKUP:TRUE]
 <LocationMatch "/index.php">
 SetEnvIf User-Agent "Googlebot" BOT
 SetEnvIf User-Agent "Slurp" BOT
 SetEnvIf User-Agent "bingbot" BOT
 SetEnvIf User-Agent "msnbot" BOT
 order allow,deny
 allow from all
 deny from env=BACKUP
 </LocationMatch>

「deny from env=BACKUP」に対して、&& env=BOT のような指定ができればと思います。
しかし、そのような記述方法を見つけることができませんでした。
どなたかご教授ください。

回答

たとえば

 RewriteEngine On
 RewriteCond %{QUERY_STRING} cmd=backup
 RewriteCond %{HTTP_USER_AGENT} Googlebot [OR]
 RewriteCond %{HTTP_USER_AGENT} bingbot [OR]
 RewriteCond %{HTTP_USER_AGENT} msnbot [OR]
 RewriteCond %{HTTP_USER_AGENT} Slurp
 RewriteRule /index.php /index.php [E=BACKUP:TRUE]
 <LocationMatch "/index.php">
 order allow,deny
 allow from all
 deny from env=BACKUP
 </LocationMatch>

というのではだめですか?
(ちなみに最初だけANDです。)

まとめちゃって

 RewriteEngine On
 RewriteCond %{QUERY_STRING} cmd=backup
 RewriteCond %{HTTP_USER_AGENT} (Googlebot|bingbot|msnbot|Slurp)
 RewriteRule /index.php /index.php [E=BACKUP:TRUE]
 <LocationMatch "/index.php">
 order allow,deny
 allow from all
 deny from env=BACKUP
 </LocationMatch>

の方がいいのかな。
NC もつけたほうが良いのかもしれない。

修正
^(Googlebot|bingbot|msnbot|Slurp)(Googlebot|bingbot|msnbot|Slurp) に修正しました。

追記

ローカル環境で試してみました。
apacheのdefaultサイトに対して
ファイルを

/index.html
/sub/index.html

と配置し、
VirtualHostに

RewriteEngine On
RewriteCond %{QUERY_STRING} cmd=backup
RewriteCond %{HTTP_USER_AGENT} (AppleWebKit|Mozilla/5.0|Mozilla/4.0)
RewriteRule /index.html /index.html [E=BACKUP:TRUE]
<LocationMatch "^/index.html">
order allow,deny
allow from all
deny from env=BACKUP
</LocationMatch>

とし( "^/index.html"にしてあるのはわざと )
、ChromeとIE6で
http://[serverIP]?cmd=backup
http://[serverIP]/?cmd=backup
http://[serverIP]/index.html?cmd=backup
がブロック(403)され、
http://[serverIP]/index.html
http://[serverIP]/sub/index.html
http://[serverIP]/sub/index.html?cmd=backup
がブロックされない事を確認、
USER_AGENTの行を
RewriteCond %{HTTP_USER_AGENT} (AppleWebKit|Mozilla/5.0)
とした場合にIE6ではブロックされなくなる事を確認しました。

あとは適宜直して試してみてください。
apacheは2.2です。

編集 履歴 (2)
  • ありがとうございます。
    下の記述で試したのですが、GoogleとBingのWeb Master Toolのクローラ巡回テストでcmd=backup付きURLをテストしてみたところ、正常にクロールできてしまいました。(なお、それ以外のURLもクロール正常でした)
    -
  • 確認ありがとうございます、上の記法の場合はどうでしょう?BOTを複数指定しない場合も確認してもらえると幸いです。 -
  • ザクっと見た感じLやRがないため処理が継続している予感。あと[ RewriteRule index.php /index.php ] なきがしますし・・ -
  • 下の方はあたまの^をとってください、UAを勘違いしてました普通のUAの途中にxxbotって出てくるんですね。apache 2.2で試しましたがそれ以外はそのまま動くと思いますよ。LやRも不要です。 -
  • 一応, 2.4で [ allow from all ] -> [ Require all granted ] 等変更あるから 2.2 以前限定ですな -
  • 質問が2.2なので問題ないと思います。2.4なら<RequireAll>\n Require all granted \n Require not env=BACKUP \n</RequireAll> ですかね。\nは改行です。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。