Perl Perl_2
Perl 「 モジュール 」 CGI.pm self_url() より便利な url() (0xe0)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xe0 回。
CGI.pm でスクリプトが生成した URL を取得するメソッド url() を確認する。
url()
メソッド「 url() 」は、(0xde) で確認したメソッド self_url() と同様に、スクリプトが生成した動的な ( ? ) URL を取得しますが、url() はもう少し多機能です。
url() の利用方法
メソッド url() は次の様にして利用します。以下は perldoc.jp の例示です。
$full_url = url();
$full_url = url(-full=>1); # 代替の構文
$relative_url = url(-relative=>1);
$absolute_url = url(-absolute=>1);
$url_with_path = url(-path_info=>1);
$url_with_path_and_query = url(-path_info=>1,-query=>1);
$netloc = url(-base => 1);
個々のパラメータは、url() が取得する URL のフォーマットを制御します。
パラメータの値はすべてが「 1 」になっていますが、これは「 真 」として設定することを意味するので、代わりに「 'true' 」とも指定出来ます。というよりも、値が「 偽 」でなければ良いので、実際には「 'ture' 」限らずどんな文字列でも有効に出来ます。例えば「 't' 」でも問題ありません。
各パラメータの動作を確認するために、Web 公開領域にサブディレクトリ「 subdir 」を作成し、直下に設置した CGI プログラムファイル「 index2.cgi 」へのアクセスを検証します。
つまり、HTTP を通したプログラムファイルへの URL は「 http://your_host/subdir/index2.cgi 」になります。
Web ブラウザを通じてアクセスする際には、URL の末尾にデタラメなクエリ文字列を与えてアクセスすることが出来るので、これを利用して検証を行います。
以下の検証では、すべて次の URL を指定してアクセスします。
http://your_host/subdir/index2.cgi?name1=value1;name2=value2
-full
パラメータ「 -full 」は、その名前の通り、フルフォーマットの URL を取得します。これは、メソッド url() をパラメータなしで利用した場合と同じフォーマットですが、-full を指定すると「 -absolute 」と「 -relative 」が上書きされます。
my $full_url = url(-full => 1);
print "$full_url\n";
得られる URL は次の通りです。
http://your_host/subdir/index2.cgi
クエリ文字列は含まれません。
-absolute
パラメータ「 -absolute 」を指定すると、( おそらく Web ドキュメントルートから ) 起動しているプログラムファイルまでの絶対パスを返します。
my $absolute_url = url(-absolute => 1);
print "$absolute_url\n";
得られる URL は次の通りです。
/subdir/index2.cgi
-relative
パラメータ「 -relative 」を指定すると、( おそらく Web ドキュメントルートから ) 起動しているプログラムファイルまでの相対パスを返します。
my $relative_url = url(-relative => 1);
print "$relative_url\n";
得られる URL は次の通りです。
index2.cgi
-absolute, -relative は、外部のプログラムファイルを呼び出して起動した後に、再度同じプログラムを呼び出したい時に有用だと思われます。
-path (-path_info)
パラメータ「 -path 」は、URL にパス情報を追加するといいますが、動作を確認してもとの特徴が掴めませんでした。
my $path_url = url(-path => 1);
print "$path_url\n";
得られる URL は次の通りです。
http://your_host/subdir/index2.cgi
-path には同義語として「 -path_info 」が用意されています。
-query (-query_string)
パラメータ「 -query 」は、クエリ文字列を追加した URL を取得します。
my $query_url = url(-query => 1);
print "$query_url\n";
得られる URL は次の通りです。
http://your_host/subdir/index2.cgi?name1=value1;name2=value2
-query には同義語として「 -query_string 」が用意されています。
-base
パラメータ「 -base 」は、プロトコルとネットでの位置 ( ポート番号込み ) を取得します。
my $base_url = url(-base => 1);
print "$base_url\n";
得られる URL は次の通りです。
http://your_host/
サブディレクトリ、プログラムファイル名が取り除かれて http ( プロトコル ) とlホスト名 ( ネットでの位置 ) だけになっています。
perldoc.jp の例示では「 http://www.foo.com:8000 」となっていますが、手元の環境では末尾のポート番号は出力されません。Web サーバ側で表示しない様に設定されているのかもしれません。
-rewrite
パラメータ「 -rewrite 」は、Web サーバ Apache のモジュール mod_rewrite が有効だった場合に有用だと言います。
mod_rewrite は、Apache の設定ファイルか .htaccess で設定出来ます。mod_rewrite は、アクセスした URL を別の URL に書き換えることが出来ます。他の領域に転送することも出来ますし、動的な URL を静的な URL に書き換えることも出来る様です。
ということは、クライアントから送られたリクエストが、サーバ上で書き換えられてしまうことになるのですが、パラメータ -rewrite を利用することで、リスクエストと一致する URL を取得することが出来ます。
my $rewrite_url = url(-rewrite => 1);
print "$rewrite_url\n";
これと、.htaccess の組み合わせを使えば、書き換えられる前の URL を取得出来ると思ったのですが、結果は思わしいものではありませんでした。
例えば、.htaccess に次の様な記述をして、HTTP アクセスを www 付きの URL に統一しました。
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^your_host\.com
RewriteRule ^(.*) http://www.your_host.com/$1 [R,L]
このファイルを Web ドキュメントルート直下に設置した状態では、www なしのホスト名のアクセスが、強制的に www ありに書き換えられます。
これに加えて、メソッド url() のパラメータ -rewrite を有効にしておけば、書き換わる前の URL を取得出来るに違いない。
そう考えていた僕の期待はまったく空振りに終わりました。
別のディレクトリから CGI ファイルのあるディレクトリに転送する設定も試してみましたが、虚しくも、やはり書き換え後の URL しか取得出来ません。
もしかすると、Apache の設定ファイルにしか対応していないのかもしれません。あるいは、共有レンタルサーバ特有の設定によって -rewrite が機能しないのかもしれません。
そうであるならば、conf ファイルを編集する権限を持っていない僕には確認の仕様がないわけです。
んー。まいった。
0xe0 -> 0xe1 へ
次回は、今回確認したメソッド url() のパラメータをまとめます。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xe1) へ続く。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)