• ベストアンサー

自CGIのURLのパス部分を取得する方法

CGIのURLが http://example.com/test/test.cgi だったとして、自身のURLのパス部分(http://example.com/test/)を出すには どのようにしたらいいでしょうか。 CGIモジュールでURLを取得して 最後の/まで切り取る方法もあるかと思いますが そのURLを取得するのと同じくらい、スマート?に出来ないでしょうか。 アドバイスのほどよろしく御願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.4

Perlを使用しているなら File::Basename モジュールを使用すれば 簡単にパスを取得できます。 use File::Basename; my $url = 'http://example.com/test/test.cgi'; my $base = (fileparse($url))[1]; print $base; File::Basename モジュールは標準モジュールなので標準ロケールさえ インストールしないような特殊な環境でない限り利用できるはずです。

masapiyochan
質問者

お礼

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

その他の回答 (5)

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.6

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;

masapiyochan
質問者

お礼

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

  • pick52
  • ベストアンサー率35% (166/466)
回答No.5

> 標準ロケールさえ ↓ 標準モジュールさえ... 誤字でした。

参考URL:
http://egg.bomcity.com/wiki?File%3A%3ABasename
masapiyochan
質問者

お礼

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

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

概ね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のパス部分が取得できます。

masapiyochan
質問者

お礼

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

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

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#[^/]+$##;

masapiyochan
質問者

お礼

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

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

環境変数 $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/; とか・・

masapiyochan
質問者

補足

すみません。 $HTTP_RUTE = $ENV{'SCRIPT_NAME'}; $HTTP_RUTE =~ s/(\/.+\/)(\w+\.cgi)/$1/; とすると、/***.cgiのようになりましたが。 私が取得したいのは、ファイル名を除くURLなんです・・・。

関連するQ&A

専門家に質問してみよう