拡張子なしでgetの値を/(スラッシュ)で区切るURLにする[perl][php]
http://www.abe-tatsuya.com/aaa.cgi?v1=bbb&v2=ccc のようなURIを http://www.abe-tatsuya.com/aaa/bbb/ccc これを実現するためにやらないといけないことは、大きく分けて、この二点です。
- 「aaa」という拡張子のないファイルが、CGI または PHP のスクリプトであることをサーバーに教えてあげる
- 「aaa」のスクリプト内で、「/」区切りで渡される値を受け付ける処理を書く
拡張子のないファイルを CGI や PHP として動作させる方法
「aaa」のような拡張子のないファイルを、CGI または PHP として動作させるには、.htaccess を使います。<Files aaa> ForceType cgi-script </Files>と書けば、「aaa」というファイルが CGI として実行されます。
PHP として実行したい場合は、
<Files aaa> ForceType application/x-httpd-php </Files>と書けば、「aaa」というファイルが PHP として実行されます。
さらに
http://d.hatena.ne.jp/tohky/20100826/1282781092perl の CGI や PHP で、「/」(スラッシュ)で区切られた値を受け取る方法
とりあえず「aaa」のようなファイル名のスクリプトが動くようになりました。
次は「/bbb/ccc」のような、一見ただのディレクトリへのリクエストのように見える URI を、スクリプトに渡される値として処理するための方法です。これには、環境変数 PATH_INFO を参照します。
例えば、perl の CGI である「http://www.abe-tatsuya.com/aaa」に対して、「/bbb/ccc」という値を渡す、つまり、「http://www.abe-tatsuya.com/aaa/bbb/ccc」という URI にアクセスさせる場合、「aaa」というスクリプトの中で、$ENV{'PATH_INFO'}を参照すると、その内容は「/bbb/ccc」となります。
なので例えば、「aaa」という CGI スクリプトの最初のほうに、
#-- PATH_INFO を「/」で分けて配列に格納 @params = split(/\//,$ENV{'PATH_INFO'}); shift(@params);等とすれば、$params[0],$params[1]... の順番に、「/」区切りで渡された値が入ります。
PHP の場合は、$_SERVER['PATH_INFO']を参照すれば、同様に処理できます。
// PATH_INFO を「/」で分けて配列に格納 $params = split("/",$_SERVER['PATH_INFO']); array_shift($params);これで、perl と同様に、$params[0],$params[1]...の順番に、「/」区切りで渡された値が入ります。
後は、渡された値に応じて、出力内容を変えるように色々とスクリプトを書けば OK です。