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
など。