mod_rewrite

しばらく間が空いてしまった。WordPress自体があまり手がかからないようで、ひととおり設定してしまえば特に問題もなく、書くこともない。

今回の件は WordPress カテゴリに含めるのも何だという気もするが、その関連ということで。

WordPress導入時、.htaccessに自動的に

CODE:
  1. # BEGIN WordPress
  2. <ifmodule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7. RewriteRule . /index.php [L]
  8. </ifmodule>
  9. # END WordPress

と書き込まれる。実在するファイル名・ディレクトリ名でない場合、/index.php が呼ばれるようになる。

さて、WordPress 導入以前に同じサイトで某日記システムを使っていたのだが、その URL は


http://www.example.com/?date=20050325

のようになるものであった。現在この URL で指示されるものはないのだが、上記により、404 エラーにはならず、トップページが表示される。

検索エンジンに旧い形式の URL が残っていて、しかもいま WordPress で作られたトップページがその旧い形式の URL の内容として着々と更新され続ける。WordPress で書いた最新の記事の内容が、http://www.example.com/?date=20050325 のものとして検索されてしまうのだ。

放っておいてもその連鎖は断ち切れないので、ロボット対策を参考に、.htaccess に次のように書き加えてみた1)

CODE:
  1. <ifmodule mod_rewrite.c>
  2. RewriteCond %{HTTP_USER_AGENT} archiver [NC]
  3. RewriteCond %{QUERY_STRING} .*date=200.*
  4. RewriteRule ^.*$ - [G,L]
  5. RewriteCond %{HTTP_USER_AGENT} crawler [NC]
  6. RewriteCond %{QUERY_STRING} .*date=200.*
  7. RewriteRule ^.*$ - [G,L]
  8. RewriteCond %{HTTP_USER_AGENT} robot [NC]
  9. RewriteCond %{QUERY_STRING} .*date=200.*
  10. RewriteRule ^.*$ - [G,L]
  11. RewriteCond %{HTTP_USER_AGENT} slurp [NC]
  12. RewriteCond %{QUERY_STRING} .*date=200.*
  13. RewriteRule ^.*$ - [G,L]
  14. RewriteCond %{HTTP_USER_AGENT} spider [NC]
  15. RewriteCond %{QUERY_STRING} .*date=200.*
  16. RewriteRule ^.*$ - [G,L]
  17. RewriteCond %{HTTP_USER_AGENT} googlebot [NC]
  18. RewriteCond %{QUERY_STRING} .*date=200.*
  19. RewriteRule ^.*$ - [G,L]
  20. RewriteCond %{HTTP_USER_AGENT} msnbot [NC]
  21. RewriteCond %{QUERY_STRING} .*date=200.*
  22. RewriteRule ^.*$ - [G,L]
  23. RewriteCond %{HTTP_USER_AGENT} findlinks [NC]
  24. RewriteCond %{QUERY_STRING} .*date=200.*
  25. RewriteRule ^.*$ - [G,L]
  26. </ifmodule>

旧URLへのアクセスは、(1)せっかく検索して見つけて来てくれる人には今のトップページをみていただく (2)検索ロボットなら 410 エラーを返す、とした。こうしておけばそのうち検索エンジンから消えるだろうし、昔の記事に直接リンクしている人はほぼいないだろうから、旧URLへのアクセスは絶滅するだろうと考えた。

----

という対策をとったのが実は1ヶ月前。だいたい思ったとおりに絶滅に向かっていったのだが、Yahoo の Slurp というのは行儀が悪いのか2)、なかなか根絶できない。

そして今日、検索で旧 URL をたどってくる人がなぜか増えている。確認すると、.htaccess の当該部分がすっかり消えている。ファイルの時刻を見ると、絶対に自分で何かをした時刻ではない。WordPress がこれを書き換えることはないと思うし、そうするとこれを置いているレンタルサーバの問題なのだろうか。なんだか気持ちが悪い。


  1. (A or B or C) and D は mod_rewrite の文法でどう書くのだろう。はっきりしないので冗長に書いた。
  2. ログを見るとアクセス頻度もやたらと多い

mod_rewrite への2件のコメント

  1. こんにちは
    Permalink Redirect というプラグインではどうでしょう。
    /index.php? へアクセスした人を指定してあるパーマリンクへリダイレクトしてくれるプラグインです。
    http://fucoder.com/code/permalink-redirect/

  2. ありがとうございます。
    ちょっと書き足りなかったのですが、乗り換えに際して過去の記事を引き継いだのではなく、内容的にはまったく別のものとして出発しましたので、個々の記事のリダイレクトは必要ないのです。
    人間が旧URLをたどってきてトップページを見ることになるのは、そのままでかまわないのですが、問題は検索エンジンに旧タイプURLが残っていて、それがWordPressによるmod_werite設定によっていつまでも有効なまま生き続けていることでした。
    Permalink Redirectは301を返すようですね。Yahooのヘルプを見ても、今回のケース(?パラメータ付をトップページへ)はどう扱われるのか判然としません。

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>