[PHP]: 404で、リダイレクトPHP
とあるウェブサイトのリニューアルで、次のような問題がありました。
- リニューアル後、リニューアルするページと、しないページがある。
- リニューアルしないページの中には、ディレクトリ構成だけが変わる箇所がある。
- ということは、各ページからのリンク付けで、「旧ページのままなのに、ディレクトリ(URL)だけ変わるところがある、ということ。
みたいな、整理するだけで面倒だなぁ、という問題です。
で、こういう時って.htaccess
で、
Redirect permanent /old/ http://www.example.com/new/
とかやる訳ですが、これだと、ディレクトリ配下の全ファイルがリダイレクトされてしまいます。
今回は、リダイレクトさせたいファイルと、させたくないファイルが有るわけです。
(諸般の事情により・・・。まぁ、色々ありますよね。)
じゃあ.htaccess
で、個別のファイルに指定すればいいじゃん、と言われそうですが、これがまた大量で。。。
しかも動的なページも有ったりして。
で、1時間考えた末、PHP、5行で解決しました。
どうしたか、と言うと、
- リンク付けは古いまま維持
- 古いリンク付けで飛んでくるディレクトリに、「404 Not Found」向けのページを設定し、そのページをPHPで作る。
具体的には、
みたいにする。ErrorDocument 404 /404.php
- 404.php 内で、どんな古いURLでアクセスしようとしているかを取得
- 新しいURLに変換。
- 新しいURLのHTMLファイルが存在するかチェック。
- 存在したら、そのページへリダイレクト。存在しなかったら、404のメッセージ(「見つかりません」、とか)を表示。
としました。
404.php内で書いたPHPの内容は、
<?
//どこのURLにアクセスしようとして404になったかを取得
$redURL = htmlspecialchars($_SERVER["REDIRECT_URL"]);
//新しいURLに変換
$path = str_replace( '/old/', '/new/', $redURL );
//該当するパスのファイルが有ったらリダイレクト
if ( file_exists( $path ) ) {
header("Location: ".$path);
exit;
}
?>
<html>
・・・
以下、「見つかりません」のHTML文書。
</html>
これで、
・旧リンクのまま維持するページは、そのまんま。
・ディレクトリ構成を変更しちゃったページは、404経由で、リダイレクト。
と、処理を分けることができました。
こんな、意味不明なソースは残したくないんですが、完全リニューアルまでの暫定処置として採用しました。
これで、泣いてたデザイナー兼コーダーの子の作業が、3日分は節約できたんじゃないか、と。
1時間、本気でPHPを書けば数十行~数百行は書けるんでしょうが、
1時間悩んで、PHP5行で解決して、手間を数日分省けた、ってのが、
「ああ、プログラムって、こういうことのために有るんだよな」と感慨にふけった日でした。