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:



