Perl日記

PerlとかRubyとかPHPとかPythonとか

Perl環境変数$ENV{PATH_INFO}

Perlでファイルをダウンロードする方法を調べていたら、
環境変数$ENV{PATH_INFO}を使用するやり方を見つけたのでメモ。

$ENV{PATH_INFO}

まず次のCGIを作る。

#!/usr/bin/env perl
# down.cgi
print "Content-type: text/html\n\n";
print $ENV{PATH_INFO};


/www.aaa.co.jp/cgi-bin/down.cgi」に設置して、
http://www.aaa.co.jp/cgi-bin/down.cgi/pokemon.txt」にアクセスすると、

#=> /pokemon.txt


と表示される。
あれ。
今やってみてわかったけど、最初のスラッシュまでとれちゃうのか。
じゃあ、最初に先頭のスラッシュを削る処理をつける。

#!/usr/bin/env perl
# down.cgi
(my $down_file = $ENV{PATH_INFO}) =~ s{^/}{};
print "Content-type: text/html\n\n";
print $down_file;


http://www.aaa.co.jp/cgi-bin/down.cgi/pokemon.txt」にアクセスすると、

#=> pokemon.txt


それに加えてGETでパラメータを渡すこともできる。
要するに、「?」をつけて動的なものだと認識させればよいといことなのだと思う。
試しにこのまま「http://www.aaa.co.jp/cgi-bin/down.cgi/pokemon.txt?number=1」にアクセスすると、

#=> pokemon.txt


となって、「?」以降は表示されなかった。

#!/usr/bin/env perl
# down.cgi
use CGI;
my $q = CGI->new;
(my $down_file = $ENV{PATH_INFO}) =~ s{^/}{};
print "Content-type: text/html\n\n";
print "PATH_INFO -> $down_file<br>";
for my $param ($q->param) {
  print "PARAM -> $param:", $q->param($param), "<br>";
}


もう一度アクセスしてみる。

#=> pokemon.txt
#=> PARAM -> number:1
#=> PARAM -> name:fushigidane


うん。
$ENV{PATH_INFO}とGETを使ってパラメータが渡せた。
ただ$ENV{PATH_INFO}を使うのはSEO対策もあるみたいなので、
$ENV{PATH_INFO}を使うかGETを使うかどちらかにした方がいいのは確かだと思う。