[PHP]: 404で、リダイレクトPHP

2008/07/28 11:48:37
カテゴリ:Web > PHP

とあるウェブサイトのリニューアルで、次のような問題がありました。

  1. リニューアル後、リニューアルするページと、しないページがある。
  2. リニューアルしないページの中には、ディレクトリ構成だけが変わる箇所がある。
  3. ということは、各ページからのリンク付けで、「旧ページのままなのに、ディレクトリ(URL)だけ変わるところがある、ということ。

みたいな、整理するだけで面倒だなぁ、という問題です。
で、こういう時って.htaccessで、

Redirect permanent /old/ http://www.example.com/new/

とかやる訳ですが、これだと、ディレクトリ配下の全ファイルがリダイレクトされてしまいます。
今回は、リダイレクトさせたいファイルと、させたくないファイルが有るわけです。
(諸般の事情により・・・。まぁ、色々ありますよね。)
じゃあ.htaccessで、個別のファイルに指定すればいいじゃん、と言われそうですが、これがまた大量で。。。
しかも動的なページも有ったりして。

で、1時間考えた末、PHP、5行で解決しました。
どうしたか、と言うと、

  1. リンク付けは古いまま維持
  2. 古いリンク付けで飛んでくるディレクトリに、「404 Not Found」向けのページを設定し、そのページをPHPで作る。
    具体的には、
    ErrorDocument 404 /404.php
    
    みたいにする。
  3. 404.php 内で、どんな古いURLでアクセスしようとしているかを取得
  4. 新しいURLに変換。
  5. 新しいURLのHTMLファイルが存在するかチェック。
  6. 存在したら、そのページへリダイレクト。存在しなかったら、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行で解決して、手間を数日分省けた、ってのが、
「ああ、プログラムって、こういうことのために有るんだよな」と感慨にふけった日でした。