- ベストアンサー
自CGIのURLのパス部分を取得する方法
CGIのURLが http://example.com/test/test.cgi だったとして、自身のURLのパス部分(http://example.com/test/)を出すには どのようにしたらいいでしょうか。 CGIモジュールでURLを取得して 最後の/まで切り取る方法もあるかと思いますが そのURLを取得するのと同じくらい、スマート?に出来ないでしょうか。 アドバイスのほどよろしく御願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Perlを使用しているなら File::Basename モジュールを使用すれば 簡単にパスを取得できます。 use File::Basename; my $url = 'http://example.com/test/test.cgi'; my $base = (fileparse($url))[1]; print $base; File::Basename モジュールは標準モジュールなので標準ロケールさえ インストールしないような特殊な環境でない限り利用できるはずです。
その他の回答 (5)
- okmotokun
- ベストアンサー率59% (92/155)
my $path=(lc(($ENV{SERVER_PROTOCOL}=~m|(\w*)/?|)[0])||"http")."://".$ENV{SERVER_NAME}.($ENV{SERVER_PORT}!=80?":".$ENV{SERVER_PORT}:"").substr $ENV{SCRIPT_NAME},0,rindex($ENV{SCRIPT_NAME},'/')+1;
お礼
ありがとうございます。 1行で目的のものが得られました。
- pick52
- ベストアンサー率35% (166/466)
> 標準ロケールさえ ↓ 標準モジュールさえ... 誤字でした。
お礼
分かりやすいページを付けて頂いてありがとうございます。
- mtaka2
- ベストアンサー率73% (867/1179)
概ねANo.2さんの回答で問題ないと思いますが、ポートが80番以外の http://www.example.com:8080/path/to/cgi/foobar.cgi みたいなURLだと、ポート番号が取れないですね。 もうちょっと正確にするなら、CGI自身のURL取得は my($url) = 'http://'.$ENV{SERVER_NAME}.($ENV{SERVER_PORT} != 80 ? ":$ENV{SERVER_PORT}":'').$ENV{SCRIPT_NAME}; って感じになります。 あとは、ANo.2と同じように、末尾の/以降を削除すれば、URLのパス部分が取得できます。
お礼
ありがとうございます。 今回の、スマートにというのは、モジュールを使わない。という意味ではなく 例えば、 http://www2u.biglobe.ne.jp/~MAS/perl/waza/cgiurl.html のような感じで、mtaka2さんのご回答いただいた内容と同じようなものが 取得できるのですが、これくらい簡単に(一発で) ファイル名を除くURLが取得できるものは無いのか。と思ったのです。 ただ、mtaka2さんのご回答いただいたもので、/以降を削除すれば 目的は得られるので、十分です。ありがとうございました。
- kumoz
- ベストアンサー率64% (120/185)
http://example.com/test/test.cgi のうち、example.com の部分は $ENV{SERVER_NAME} または $ENV{HTTP_HOST} で取り出すことができます。また、/test/test.cgi の部分は $ENV{SRCIPT_NAME} で取得ができます。 $url_path = "http://$ENV{SERVER_NAME}$ENV{SCRIPT_NAME}"; $url_path =~ s#[^/]+$##;
お礼
ありがとうございました。
- ORUKA1951
- ベストアンサー率45% (5062/11036)
環境変数 $ENV{'SCRIPT_NAME'}にそのCGIをHTTPサーバー利用する場合の名前が入っています。一方、環境変数$ENV{'SCRIPT_FILENAME'}には、そのサーバー上の名前が入っています。 たとえば、 / |-- /cgi-bin | |--/usernasme | | |-- /test.cgi |-- /home | |-- index.html(A) というサーバーの構成で、HTTPサーバーからは、 |--/username | |-- index.html(A) | |-- /cgi-bin | | |-- test.cgi とされている場合、 たとえば、 $ENV{'SCRIPT_NAME'} = /username/cgi-bin/test.cgi $ENV{'SCRIPT_FILENAME'}} = /cgi-bin/test.cgi が入っています。 わかりやすい書き方をすると $HTTP_RUTE = $ENV{'SCRIPT_NAME'}; $HTTP_RUTE =~ s/(\/.+\/)(\w+\.cgi)/$1/; とか・・
補足
すみません。 $HTTP_RUTE = $ENV{'SCRIPT_NAME'}; $HTTP_RUTE =~ s/(\/.+\/)(\w+\.cgi)/$1/; とすると、/***.cgiのようになりましたが。 私が取得したいのは、ファイル名を除くURLなんです・・・。
お礼
ありがとうございます。 ファイル名を除くには、そのような方法もあるのですね。今後の参考になります。 File::Basenameですか、勉強しておきます。