MP970 をLinux で使う方法についてメモったページのファイル名を変えたんだけど、
検索エンジンが追随してくれず、404 になってしまうので困った。

Apache の404 Not Found 画面はあまりに素っ気なかったので、
Google 提供のカスタム 404 ウィジェットを導入してみた。

が、そもそもぐぐる様が追随してくれないんだからどうにもならん。
というわけで、間違ったファイル名を元に、正しいファイル名を類推するスクリプトを書いた。

サイトマップ向けに完全なURL を含んだXML を吐いているので、
それを元にレーベンシュタイン距離を求めて正しいファイル名らしい文字列に行き当たる感じ。

サイトマップ向けXML に、勝手にtitle とかタグを追加したり変なことをしているので、
もしかしたら検索エンジン側のフォローから漏れるかも。

とってもいい加減なコードはこんなの。
$match_path に相対パス、$match_title にタイトルが入るはず。

<?php
$shortest = -1;
$list = file_get_contents("<mt:Link template="サイトマップ">");
$xml = new SimpleXmlElement( $list );
$req_path = pathinfo($_SERVER['REQUEST_URI']);
$req_str = $req_path['dirname'] . '/' . $req_path['filename'];
$match = '';
 
foreach ($xml->url as $l_url) {
	$loc = parse_url($l_url->loc);
	$title = $l_url->title;
	$url_path = pathinfo($loc["path"]);
	$url_str = '';
	if(ereg("<mt:BlogFileExtension >$", $url_path['basename'])) {
		$url_str = $url_path['dirname'] . '/' . $url_path['filename'];
		if(strcmp($req_str, $url_str) == 0) {
			$match_path = $url_str . "<mt:BlogFileExtension >\n";
			$match_title = $title;
			break;
		}
		$lev = levenshtein($req_str, $url_str);
		if ($lev <= $shortest || $shortest < 0) {
			$match_path = $url_str . "<mt:BlogFileExtension >\n";
			$match_title = $title;
			$shortest = $lev;
		}
	}
}
 
if(empty($match_title)) {
	$match_title = $match_path;
}
echo '			<a href="' . rtrim($match_path) . '">' . rtrim($match_title) . "</a>\n";
?>

これをカスタム404ページに埋め込んでウマー。

PHP Hacks―プロが教えるWebプログラミングテクニックPHP Hacks―プロが教えるWebプログラミングテクニック
Jack D. Herrington 牧野 聡

オライリージャパン 2006-06
売り上げランキング : 51010
おすすめ平均

Amazonで詳しく見る
by G-Tools