古い記事
ランダムジャンプ
新しい記事
amazon がやってるみたいに
「同じコンテンツを指す複数のURLを、
クローラーが来たときだけ正規化した一つのURLにリダイレクト」
したい。

そこで「.htaccess」に以下のように記述した。
RedirectMatch ^/bot/([0-9A-Z]{10})/ http://example.com/asin/$1/
RewriteEngine On
RewriteRule ^asin/([0-9A-Z]{10})/$ go.cgi?asin=$1 [L]
RewriteCond %{HTTP_USER_AGENT} bot|ahoo|craw|spid [NC]
RewriteRule ^asin/([0-9A-Z]{10})/(.+-22)/$ bot/$1/
RewriteRule ^asin/([0-9A-Z]{10})/(.+-22)/$ go.cgi?asin=$1&aid=$2 [L]

普通にブラウザから
http://example.com/asin/00000000/yto-22/
にアクセスすると
http://example.com/go.cgi?asin=00000000&aid=yto-22
が実行される。
クローラがアクセスすると
http://example.com/bot/00000000/
にリダイレクトされ、それが
http://example.com/asin/00000000/
にリライトされ、最終的に
http://example.com/go.cgi?asin=00000000
が実行される。

とりあえず実現できたものの、なんか釈然としないなあ、
と思い「Apacheクックブック」を引っ張り出して見てみると
もっとシンプルな方法が載っていた。
それ見て書き直し。
RewriteEngine On
RewriteRule ^asin/([0-9A-Z]{10})/$ go.cgi?asin=$1 [L]
RewriteCond %{HTTP_USER_AGENT} bot|ahoo|craw|spid [NC]
RewriteRule ^asin/([0-9A-Z]{10})/(.+-22)/$ /asin/$1/ [R=301]
RewriteRule ^asin/([0-9A-Z]{10})/(.+-22)/$ go.cgi?asin=$1&aid=$2 [L]

RewriteRule の "[R]" でリダイレクトするだけ。
勉強になるなあ。

Apacheクックブック - Webサーバ管理者のためのレシピ集