mod_rewrite:RewriteMapで柔軟なURL書き換え

今回は旧blogの記事をこのblogの記事にパーマネントリダイレクトしたいと思ったので調べてみました!
しかし、単純にリダイレクトしようと思っても馬鹿やったせいで記事番号がずれており、ドメイン部分を書きえるだけでは済みません;
これは大手術が必要そうだ…ということでmod_rewrite、ruby両先生にお願いしました

mod_rewriteといえばリダイレクト業界のスイスアーミーナイフに例えられる万能モジュールですが、書き換え処理をperl、php、rubyなどのプログラムに任せることも出来ます

まずはURL書き換え用のrubyスクリプトを書きます
[ruby]
#!/usr/bin/ruby

#入出力をバッファリングさせないため
$stdin.sync = 1
$stdout.sync = 1

#標準入力(記事ID)に14を足して出力
num = $stdin.gets
$stdout.puts num.to_i+14
[/ruby]

次に書き換え処理を行うプログラムファイルをRewriteMapで指定します
これは.htaccessファイルでは指定できません!なのでhttpd.conf(apache2.conf)に直接記述します
[apache]

RewriteEngine on
RewriteLock /tmp/map.lock
RewriteMap test prg:/path/to/faile/rewrite.rb

[/apache]
testというMap名でrewrite.rbを読み込ませます
rewrite.rbの変更を反映させるにはApacheに再読み込みさせる必要があります

これを実際にMapを使いたいディレクトリの.htaccessから、
[apache]
RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^e=([0-9]*)(.*)$
RewriteRule ^index.php$ http://yusukezzz.dyndns.org/blog/archives/${test:%1|0}? [R=301,L]
[/apache]
${Map定義名:引数|引数のデフォルト値}のような形でMapを呼び出します
今回はRewriteCond %{QUERY_STRING}で記事IDを抽出してそれを渡しています
後は忘れずにR=301でパーマネントリダイレクトであることを指定します

以上、ちょっと大変でしたが無事リダイレクトに成功しました!
後は旧blogで使ってた画像のリンクが切れる場合があるのでsrcを絶対URL指定に変えなくては…

参考サイト
Stack-Style: rubyスクリプトでRewriteMapを書く際の注意点

カテゴリー: All   タグ: , ,   この投稿のパーマリンク

コメントをどうぞ

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

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