a-blogからのコンバート後のリダイレクト処理
Posted: Updated:
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つの手順を踏むことによって解決してみます。
- config.server.phpにリダイレクト処理を書き込む
- htaccessでheadline.php, photo.phpへのアクセスをindex.phpに
- 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だけです、はい。