mod_rewrite すげぇぇぇぇぇえええ(゚Д゚)

yf-akiha2008_wuxga3というわけで、なんとなく今使ってる壁紙ですけど。それはおいといて。
Wordpress へ移行したものの、古いコンテンツへの直接リンクに対してどのように対処すべきか、と考えていたわけです。ひとまずは、VirtualHost へ

“Redirect /log http://blog.oshiire.to/log”

とかしてみましたけど、これってスマートじゃないです。古いコンテンツをそのまま使うだけなので。

おのおのの URI は次の通りです。
SB:/log/eid???.html
WP:/archives/???
では、この ??? さえ同じであれば、簡単に RedirectRewrite すれば安心・・・と考えていたんです。

しかしながら、SB の開始番号と、WPでの開始番号が食い違っている上、SBでは欠番があったりとかして、番号がひどくめちゃめちゃに。

いろいろと調べたところ、次のような関係にあることが分かりました。(SB の対象の数値を x とします)

SB:    x < 98 → WP: x+7
SB:  98 <= x < 265 → WP: x+6
SB: 265 <= x < 404 → WP: x+5
SB: 404 <= x → WP: x+4

ただでさえ、演算が必要なのに、条件分岐まで必要です。/log/eid???.html の先頭に URL転送埋め込もうか、と考えていたときでした。

mod_rewrite – RewriteMap なる機能を見つけました。ようするに、URL変換に、外部プログラムを使用できる、ということ。
さっそく Perl で組んだわけですけど、1)引数と標準入力の違い 2)$_変数 3)if〜elsif〜else などなど、多彩に物事を忘れていたために、こんな簡単なアルゴリズムですら 1時間近くかかってしまいました orz

標準入力からもらいうけた、”x” の値を、先の条件に合わせて数値変更して標準出力へ出力するだけです。バッファリングしちゃいけない、という禁止事項さえ忘れなければ単純です。

後は、対象となる Virtual Host@Apache2 へ、以下を定義するのみです。

RewriteEngine On
RewriteLog /tmp/rewrite.log
RewriteMap escape-map prg:/path/to/program.pl
RewriteRule ^/log/eid(.+)\.html$ /archives/${escape-map:$1} [R=301,L]

RewriteMap で、外部のプログラムを指定
RewriteRule で、指定したMapと対象の数値を指定します。[R=301] が重要です。URI を変換しておかないと、その後、.htaccess でもさらに Rewrite している部分と競合して、うまくいきませんでした。

ぁぁ、ここに行き着くまでに 2時間もかかっちゃいました。現場から離れると、こーゆーのに弱くなっていけません。ホント。
あと、どうしてもうまくいかないときは、RewriteLog / RewriteLogLevel 9 で指定すると、いい調子でログをはいてくれるので嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です