a-blogからのコンバート後のリダイレクト処理

a-blog から a-blog cms にコンバートしたあとに役立つかもしれない

とっくの昔に旬を過ぎている気がしますが、ひさびさにa-blogからa-blog cmsへのコンバートがあったので、リダイレクト対策をしっかりやってみました。

前提条件 plainまたはvicunaのインストール直後に、a-blogからのコンバートツールを利用して、データ移行した環境

a-blog でブログを運営していた場合、検索エンジンや各所からのトラックバック、リンクなどなどa-blog的なURLからのリンクが、ネット上に溢れている状態からスタートします。

a-blog cmsに移行後、それらのURLからアクセスされた場合、もちろんa-blog cmsのURLの書式には合っていないので404になってしまいます。今回は、その問題を以下の3つの手順を踏むことによって解決してみます。

  1. config.server.phpにリダイレクト処理を書き込む
  2. htaccessでheadline.php, photo.phpへのアクセスをindex.phpに
  3. URLの正規化を検索エンジンなどなどに伝える

1. config.server.phpにリダイレクト処理を書き込む

<?php
class Redirect
{
    var $url;

    function __construct()
    {
        $base       = 'http://'.HTTP_HOST.'/';
        $this->url  = $base;

        if ( !empty($_GET['ID']) )      $this->transEid();
        if ( !empty($_GET['cID']) )     $this->transCid();

        if ( !empty($_GET['date']) )    $this->transDate();
        if ( !empty($_GET['tag']) )     $this->transTag();

        if ( $base != $this->url ) $this->redirect();
    }

    function transEid()
    {
        $eid    = intval($_GET['ID']);
        $this->add("bid/1/eid/$eid/");
    }

    function transCid()
    {
        $cid    = intval($_GET['cID']);
        $this->add("bid/1/cid/$cid/");
    }

    function transDate()
    {
        $date   = explode('-', date('Y-m-d', strtotime($_GET['date'])));
        $y      = $date[0];
        $m      = $date[1];
        $d      = $date[2];
        $this->add("$y/$m/$d/");
    }

    function transTag()
    {
        $tag    = htmlentities($_GET['tag'], ENT_QUOTES);
        $this->add("tag/$tag/");
    }

    function add($str)
    {
        $this->url .= $str;
    }

    function redirect()
    {
        header(PROTOCOL.' 301 Moved Permanently');
        die(header('Location: '.$this->url));
    }
}

new Redirect();
?>

上記のコードをconfig.server.phpに付け加える形でコピペします。php側でa-blogっぽいURL目当てのアクセスがあった際に、a-blog cmsのURLに変換してリダイレクトします。

2. htaccessでheadline.php, photo.phpへのアクセスをindex.phpに

RewriteCond %{REQUEST_URI} ^(.*)(/headline.php|/photo.php)$
RewriteRule .* %1/index.php [L,R]

上記のコードをhtaccessに追記します。RewriteEngine onの後ろあたりでいいです。a-blogのheadline.phpやphoto.phpを目当てにアクセスされたときに、a-blog cmsのindex.phpにリダイレクトします。a-blog cmsはindex.phpのみですので、a-blogにしかないファイルにアクセスしようとされたらindex.phpに流します。

3. URLの正規化を検索エンジンなどなどに伝える

<link rel="canonical" href="%{PERMALINK}"/>

上記のコードをすべてのテンプレートのhead要素内に追記します。a-blog的URLからのアクセスを、無理矢理a-blog cmsにねじ曲げているため、本来のパーマリンクと異なるURLとしてリダイレクトされます。

それだと、URLが正規化されないので、canonicalの指定が必須といえます。各種パラメータがURLについてきてしまうことを考えると、%{PERMALINK}を利用したURLの正規化は、リダイレクト関係なしに必須でないかと。今更ですが、他に問題なければ、次期バージョン以降のテンプレートには標準で書いておきたいところ。(URLの正規化については特に説明しないれす)

canonicalの指定は、はてなブックマークも対応してくれているらしいので、はてブ数を気にしている方にもオススメですね。

そんな感じで遅すぎるネタでした!

今更ですが、今からでも遅くない!という方は適当に参考になさってください。たぶんこのエントリーのキモはcanonicalだけです、はい。