• ベストアンサー

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

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

  • Perl
  • 回答数6
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • URLのサブドメインとドメイン部分の取得

    PHPのpreg_matchでURLのサブドメイン部分とドメイン部分を取得したいのですが、どのように書けばよいでしょうか? たとえば、「http://www.example.com/index.html」だった場合、 「www」と「example.com」を取得して、 「http://sample.www.example.co.jp」だった場合は、 「sample.www」と「example.co.jp」が取得したいと考えています。

    • 締切済み
    • PHP
  • www.URL 付のcgi を動かす

    URL付のcgi を動かすにはどうしたらいいのでしょう。 つまり2つの独立したサーバーがあり、お互いに 呼び出して実行したい場合、同一サーバーなら通常、 $test= 'home/public_html/cgi/test.cgi'; open (test); print while <test>; ちょっとまどろっこしいんですが、このように実行 できるかと思うんです。 しかし、別のサーバーにあるとこうはかけません。 したがって1行目を $test= 'http://test.com/cgi/test.cgi'; ・・・と書きたいところなのですが、どうもうまく 実行されないようです。 何かいい解決策があれば教えてください。

    • ベストアンサー
    • Perl
  • PerlでCGIを書いておりますが、特定のURL(ディレクトリ)の位置データを取得するには?

    PerlでCGIを書いております。 http://test.com/a/test/index.cgiにアクセスしているときに、perlがaを取得して、http://test.com/b/test/index.cgiにアクセスしているときbを取得する良い方法は有るのでしょうか?WindowsとLinuxの両方で動作できれるものがあれば宜しくお願いします。 WindowsとLinuxではディレクトリの感じが違うようなので1個の方法で実現できれば助かります。

    • 締切済み
    • CGI
  • CGIから移動したページでのリンク元URLの取得について

    CGIから移動したページでのリンク元URLの取得について CGIのHTML表示部を print<<End_of_Data; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Refresh" content="5;URL=http;//example.com/index.html" /> <title>認証OK</title> </head> <body>会員ページに移動します</body> </html> End_of_Data としています。 5秒後にリダイレクト先のexample.comに移動するようにしているのですが、 このリダイレクト先でリンク元を取得することができません。 リンク元URLを取得するにはどうしたらよろしでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • SSIで呼び出したURLの取得

    a.shtmlから ../a.cgi をSSIで呼び出したとき、a.shtmlのURLを取得したいのですが、うまい方法はありますでしょうか。 $ENV{'REQUEST_URI'} $ENV{'SCRIPT_FILENAME'} $ENV{'SCRIPT_NAME'} で表示してみたら、a.cgiのURL(パス)が出てきて、a.shtmlのURL(パス)が出てこなかったのです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • メール送信されたurlを取得したい

    HTML_QuickFormを使ってフォームをつくる予定なのですが どこのページから送信されたのかを取得したいと思っているのですが どのような方法がありますでしょうか? 具体的には http://example.com/sample1.htmlと http://example.com/sample2.htmlと http://example.com/sample3.htmlに フォームがありどこのページから送信されたかを取得したいと いうことです。 また、postでメール送信するのですがメール送信時に取得した urlを表示させる場合どのようにすればいいのでしょうか?

    • 締切済み
    • PHP
  • 今いるURLを取得する方法

    自分で調べましたが見当たらなかった為質問させていただきます。 携帯サイトで今いるURL 例:http://test.com/test1/test.html?testid=5553 を取得し、次のページに値を渡して『戻る』機能をつけようと考えているのですが、その"今いるURL"の取得方法がわからず困っています。 とても単純な質問で申し訳ございませんがよろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • CGIのパスについて?

    HTMLで表示するタイプのBBSのパスについて教えて下さい。同じフォルダー( xx )の中にCGIファイル( bbs.cgi )とHTMLで表示する部分のファイル( index.html )と、プログラムには関連の無い只の案内ファイル( info.html )があります。index.html とinfo.html 間は問題ないのですが、フォーム(別ページでの呼出し。bbs.cgi ?mode=formでの呼出し。)ページからinfo.html へは”info.html ”でリンクを張ると、できません。タスクバーに・・xx/bbs.cgi /info.html /となります。そこで、”../info.html ”でリンクを張ると、そちらへ移動できますが、info.html からフォームへ戻るパスを”bbs.cgi ?mode=form”や”http://www・・・bbs.cgi ?mode=form”(絶対パス)で書くと、1回目は戻れますが、行ったり来たりが出来ません。フォーム→info.html →フォーム→ (ダメ)info.html 。パスはどう書けば良いのでしょうか?ちなみにローカルでのテストです。2回めのinfo.html へのタスクバー表示は1階層上を指しています。少し分かりにくくてすみません。要は行ったり来たりできるパスの書き方を教えて下さい。m(__)m

    • ベストアンサー
    • CGI
  • フルパスを取得するにはどうすればいいですか

    access2003です 自身のファイル名を取得するのは Sub test() MsgBox CurrentProject.Name End Sub で出来ますが フルパスを取得するにはどうすればいいですか? よろしくお願い致します。

  • 自CGIのURLの一部を取得する方法

    http://xxx.jp/xxx/xxxxxxx/xxxxxx.cgi?cmd=s&xxxx&xxx&Tfile=Data&TrColor=%xxx&Sort=xxx_xxxx&page=1 上記のようなURLがブラウザに表示されていて、末尾に「page=1」という文字がある時だけ HTMLのMETAタグのDESCRIPTIONに page=1 を挿入したいです。 ちなみに、そのページには、以下のように DESCRIPTIONが記載されており、下記の★の部分に 「page=1」というURLの一部の文字を挿入したいと考えています。 <META name="description" content="説明文 ★"> Perl でどのように記述すれば宜しいでしょうか? どうかアドバイスをお願い致します。 m(_ _)m

    • ベストアンサー
    • Perl

専門家に質問してみよう