2007年04月01日

アマゾンのようなパス

PHPでは、一般的にクエリーは、

hogehoge.php?a=1&b=2&c=3

のように書く。そして、プログラムのほうでは、$_REQUEST["a"]とかで、クエリー文字列を得る。
会員のページを表示する時は
member.php?id=1000

とかって。
前々から思ってたことで、これだと、じゃ、1001番の人は誰?って言うんで
member.php?id=1001

とアドレス欄に入力してた。

つまり、URLのクエリーを見れば、容易に、そのクエリーの意味がわかってしまうわけである。

アマゾンのサイトを見てみよう。
このサイトもどう考えても、データベースばりばりのサイトなのだが、上のような一般的なURLではない。?や&が一切見当たらない。まさか、こんな深い階層に実際のページがあるもと思えない。

これは一体、どうやって実現しているのか?

先の例で言うと

member.php?id=1000

member/1000/

でアクセス出来ないのか?

というギモンが前々からあったんですが、ちょっとした調べものの際に判明した。

まず、member/1000/ なURLを指定されても、member.phpを動かしたいわけで、そのために、.htaccessファイルをいじってやる。

<FilesMatch "^member$">
ForceType application/x-httpd-php
</FilesMatch>

これで、member.php と言うファイルを、拡張子なしの member という名前でアクセス出来る。
これはもちろん、member.php のあるディレクトリに入れておく。

次に、member.php の中で、後ろのパスを取得すればいいので、これには、環境変数(PATH_INFO)を使う。
スラッシュ(/)区切りの文字列が返ってくるので、これを分解して、あたかもクエリーのように扱えばいい。

$path_info = explode('/', $_SERVER['PATH_INFO']);
while(list($cnt,$path) = each($path_info)) {
    print "(".$cnt.")[".$path."]";
}

注意しないといけない点は、0番目は必ず空文字になる。$_REQUESTとは違い、パスの順番でしか取れないので、順番を変えると、プログラムが全く動かなくなってしまう。

アマゾンでも見受けられるが、次のようにすれば、$_REQUESTのキー配列のように受け取れる。

member/sex=man/age=40/pref=18/

のように、パス名に、「キー=値」のように書く。
受け取るPHPでは、

$path_info = explode('/', $_SERVER['PATH_INFO']);
while(list($cnt,$path) = each($path_info)) {
    if ($path == "") continue;
    list($key,$value) = explode('=', $path);
    $_REQUEST[$key] = $value;
}

として、$_REQUESTに入れてしまう。
こうすれば、

member.php?sex=man&age=40&pref=18

と書いたPHPのプログラムがそのまま使える。

ちょっとした見た目のカッコよさもありますが、検索エンジンが動的ページを嫌う対策に1つになるのでは。

参考エントリー
動的ページを静的ページにする (PATH_INFO)
デジットさんの動的ページを静的ページに見せる(PHP)
Web屋のネタ帳 動的ページと静的ページ(1) 一般論

2007年04月01日 12:01 | Webシステム


トラックバック

このエントリーのトラックバックURL:

コメント

コメントしてください




保存しますか?