プロが教える店舗&オフィスのセキュリティ対策術

CGIのURLが http://example.com/test/test.cgi
だったとして、自身のURLのパス部分(http://example.com/test/)を出すには
どのようにしたらいいでしょうか。

CGIモジュールでURLを取得して
最後の/まで切り取る方法もあるかと思いますが
そのURLを取得するのと同じくらい、スマート?に出来ないでしょうか。

アドバイスのほどよろしく御願いします。

A 回答 (6件)

Perlを使用しているなら File::Basename モジュールを使用すれば


簡単にパスを取得できます。

use File::Basename;

my $url = 'http://example.com/test/test.cgi';
my $base = (fileparse($url))[1];

print $base;

File::Basename モジュールは標準モジュールなので標準ロケールさえ
インストールしないような特殊な環境でない限り利用できるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ファイル名を除くには、そのような方法もあるのですね。今後の参考になります。
File::Basenameですか、勉強しておきます。

お礼日時:2008/10/09 12:34

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;
    • good
    • 0
この回答へのお礼

ありがとうございます。
1行で目的のものが得られました。

お礼日時:2008/10/09 12:37

> 標準ロケールさえ



標準モジュールさえ...

誤字でした。

参考URL:http://egg.bomcity.com/wiki?File%3A%3ABasename
    • good
    • 0
この回答へのお礼

分かりやすいページを付けて頂いてありがとうございます。

お礼日時:2008/10/09 12:35

概ね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のパス部分が取得できます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今回の、スマートにというのは、モジュールを使わない。という意味ではなく
例えば、
http://www2u.biglobe.ne.jp/~MAS/perl/waza/cgiurl …
のような感じで、mtaka2さんのご回答いただいた内容と同じようなものが
取得できるのですが、これくらい簡単に(一発で)
ファイル名を除くURLが取得できるものは無いのか。と思ったのです。

ただ、mtaka2さんのご回答いただいたもので、/以降を削除すれば
目的は得られるので、十分です。ありがとうございました。

お礼日時:2008/10/09 12:30

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#[^/]+$##;
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2008/10/09 12:23

環境変数 $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なんです・・・。

補足日時:2008/10/08 23:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!