Rewish

PHPで作る「ちょっと便利で優しい404ページ」

アドレスバーに直接URLを打ち込んで移動すると、タイプミスで間違ったページへ移動してしまい「404 Not Foundが表示された」なんて言う経験、ありますよね?

そんな時でも安心な、ちょっと便利で優しい404ページを作ってみたいと思います。

概要

「ちょっと便利で優しい404ページ」とは、予めサイト内のURLリストを書き出しておき、間違って入力されたURLと比較して、もっとも近い 実在URL を返す404ページです。

PHPで扱えればURLのリスト自体は何でも構いませんが、今回はsitemap.xmlを使った方法を紹介します。

ソースコード

404.php

<?php
/**
 * もしかしてお探しのページは [URL] ではありませんか?
 *
 * @param  string $sitemap サイトマップファイル
 * @return string 最も近い実在URL
 */
function maybeURL($sitemap) {
	// サイトマップ読み込み
	$data = file_get_contents($sitemap);

	// URLを抜き出す正規表現
	$pattern = '/<loc>http:\/\/[^\/]*(.*)<\/loc>/';

	// $urlList[1]にURLリストが入る
	preg_match_all($pattern, $data, $urlList);

	// 最短距離の初期値
	$shortest = -1;

	// 最も近い実在URLを探し始める
	foreach ($urlList[1] as $val) {
		// リクエストURLとリストURLの距離を計算する
		$lev = levenshtein($_SERVER['REQUEST_URI'], $val);

		// 二つの距離が0(同一文字列)なら終了
		if ($lev === 0) {
			$existURL = $val;
			$shortest = 0;
			break;
		}

		// 二つの距離が最短距離よりも短いか、
		// 最短距離が初期値の場合、最短距離書き換え
		if ($lev <= $shortest || $shortest < 0) {
			$existURL = $val;
			$shortest = $lev;
		}
	}

	// 最も近い実在URL
	return $existURL;
}

$url = maybeURL('sitemap.xml');
?>

<h1>404 指定されたページは存在しません</h1>
<p>お探しのページは<a href="<?php echo $url; ?>"><?php echo $url; ?></a>ではありませんか?</p>

sitemap.xmlのパスやHTML部分は適当に書き換えてください。

404ページに設定する

404.phpを404ページとして利用できるように設定して下さい。

.htaccess なら ErrorDocument 404 /404.php など。