Linuxからアホ話まで、何でもありでござる

2005年02月19日

mod_rewriteでURL書き換え

[Nucleus]
このサイトでは昔のコンテンツに飛んできた人のために.htaccessやmod_rewriteで新しいほうに飛ぶよう設定している。昔のコンテンツに飛んできた人はとりあえず目的の所へ辿り着くことができるはずだ。しかしここで大きな問題が発生した。

MovableTypeとNucleusでは個別エントリのURL記述が全く違うので個別エントリについてはこつこつとRedirect permanentでURLを指定してやったわけだが、月や日別のアーカイブはMobavleTypeで使っていたものを流用できる為、httpd.confに次のように記述して対処していた。
RewriteEngine On

RewriteRule ^/archives/([0-9]+)_([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2_$3.$4

RewriteRule ^/archives/([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2.$3

RewriteRule ^/oyaji/archives/([0-9]+)_([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2_$3.$4

RewriteRule ^/oyaji/archives/([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2.$3

アーカイブのディレクトリが/archives と/oyaji/archivesの二種類あるのは、あるときアーカイブのディレクトリをごそっと移動させたためだ。このせいで/oyajiディレクトリ内の.htaccessだけでは対応できなくなってしまっていた。そのためまずhttpd.confで一部変換後/oyajiディレクトリ内の.htaccessでNucleus用のURLに変換させるという2段構えで対処してみたのだ。これでとりあえず過去のURLでとんできた人を現在のエントリに飛ばすことは出来たのである。

しかしその後が良くない。飛んできた後ページ内のリンクをクリックすると存在しないURLにジャンプしてしまいエラーになるのだ。

よく見てみると、書き換える前のURLの一部(上記の赤文字の部分)を引きずっているようでおかしなディレクトリの指定になってしまっていた。

これではあまりにひどいのでどうにかしなくてはならない。調べてみるとmod_rewriteのおまじないのひとつに[R=301,L]というのがあって、これを使うと
この方法が有用な点は、R=301 という指定で、HTTPステータスコードの301(=Moved Permanently、永久に移動したという意味)を返した上で、URLを書き換えてジャンプさせることができるということです。

との事らしい。で、早速このおまじないを加えてみると見事にうまくいった。

修正後はこんな感じ
RewriteEngine On

RewriteRule ^/archives/([0-9]+)_([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2_$3.$4 [R=301,L]

RewriteRule ^/archives/([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2.$3 [R=301,L]

RewriteRule ^/oyaji/archives/([0-9]+)_([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2_$3.$4 [R=301,L]

RewriteRule ^/oyaji/archives/([0-9]+)_([0-9]+).(html|php)+ http://oyajiman.minidns.net/oyaji/$1_$2.$3 [R=301,L]


ブログランキング・にほんブログ村へ
posted by oyajiman at 2005年02月19日 22:05:00



コメント

コメントはありません

トラックバック

トラックバック
このエントリにトラックバックはありません
このトラックバックURLを使ってこの記事にトラックバックを送ることができます。 もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。.

コメントする