Hatena::ブログ(Diary)

あじゃぱー

2008-11-26

[]PATH_INFOを使ってスマートなURLに

クエリー式の URL を使うスクリプトは人にもクローラーにも好かれないようです。

#!/usr/bin/env perl
use CGI;

my $q = CGI->new();
my $user = $q->param('user');
my $page = $q->param('page');

print <<"EOT";
Content-type:text/html;

<html><body>
USER: $user<br>
PAGE: $page<br>
</body></html>
EOT

http://localhost/cgi-bin/test.cgi?user=aaa&page=11 のような複雑怪奇な URL は見ただけでゲンナリします。

そこで環境変数 PATH_INFO を使うとスマートな URL を実現できます。

#!/usr/bin/env perl
my ($user, $page) = $ENV{'PATH_INFO'} =~ m!/([^/]+)/([^/]+)/?!;

print <<"EOT";
Content-type:text/html;

<html><body>
USER: $user<br>
PAGE: $page<br>
</body></html>
EOT

$ENV{'PATH_INFO'} には URL のスクリプト以降の部分が入っています。

http://localhost/cgi-bin/test.cgi/aaa/11/

URL がスッキリして印象が良くなりましたね!


さらに test.cgi の部分があか抜けない印象を与えるかもしれません。ここでは簡単に .htaccess を使って改善してみましょう。

まず test.cgi -> test にリネームします。

そして同ディレクトリに .htaccess を以下の内容で作成します。

<FilesMatch "^test$">
ForceType cgi-script
</FilesMatch>

http://localhost/cgi-bin/test/aaa/11/

とってもスマートになりました!


さらにさらに、cgi-bin がいまいちな感じです。

HTMLなどを置く DocumentRoot ディレクトリで CGI を実行できるようにしましょう。

/test.cgi を作成し、同ディレクトリに .htaccess を以下の内容で作成します。

AddHandler cgi-script .cgi
Options +MultiViews +ExecCGI
MultiviewsMatch Handlers

http://localhost/test/aaa/11/ 完璧ですね!

しかし、.htaccess を使うことは多少負荷をかけるようなので他の方法も検討してください。


(ref)

PATH_INFO

動的ページを静的ページにする (PATH_INFO)

MultiViewsMatchでハンドラをMultiViews検索に追加 : おまえのログ