• ベストアンサー

パールスクリプトを呼び出すときのパスの指定について

わたしはあるインターネットのスクールに通っていたのですが パスについて頭が混乱しています。 CGIのコースのアクセスカウンターの授業で ディレクトリ構造が /usr/home/www/s1000000/cgi-bin/counter.pl となっているパールスクリプトをhtmlファイルのimgタグで呼び出すとき <img src="/usr/home/www/s1000000/cgi-bin/counter.pl?NAME=username&KETA=4">(その1) と記述したらうまく動作せず、 <img src="/~s1000000/cgi-bin/counter.pl?NAME=username&KETA=4">(その2) と訂正され、解決しました。 サーバのローカルルールでホームディレクトリのファイルは/~で呼びだせるように なっているようなのですが、それならば(その1)と(その2)は 同じことだと思うのです。 パスの相対指定はわかるのですが、絶対指定やurl指定がわかりません。 (その1)は絶対指定で(その2)はurl指定ということなのですか? (その1)と(その2)の違いは何ですか? なぜ(その1)では動作しないのですか? パスの根本的なところを知りたいです。 どなたか教えていただければ幸いです。

  • CGI
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • cocky
  • ベストアンサー率57% (232/402)
回答No.2

話が専門的になりますがお覚悟を。 一応環境として、WebサーバにApacheを使っているものとして話します。 そもそも<IMG>タグのSRCで指定するパスは全てURL指定で記述しなければなりません。 で、URL指定でパスが指定された場合に、それをどのように絶対パスに置き換えるかについては、Apacheのhttpd.confで設定された内容によって動作が変わります。 それで、まず~(ティルダ)を使わずにディレクトリを指定すると、URL→絶対パスへの変換の際、自動的にhttpd.conf内のDocumentRootで指定されたディレクトリ名がパスの頭に補完されます。 そのため、仮にDocumentRootに「/usr/home/www」が設定されていたとすると、(その1)の例では絶対パスは「/usr/home/www/usr/home/www/s1000000/cgi-bin~」(長くなるので以下省略)という風に変換されてしまうので、当然「そんなパスは存在しません」ということで、CGIは動作しないわけです。 一方、URL指定にティルダを使った場合は、(厳密にはhttpd.confの設定によるが)通常の場合OSの持つホームディレクトリ情報に従ってURL→絶対パスへの変換を行います。この際DocumentRootによるパス補完は働かないため、(その2)では「/~s1000000」→「/usr/home/www/s1000000」という形で変換が行われ、結果的に狙ったCGIを呼び出すことができたわけです。 細かいことを言えば、URL→絶対パスへの変換や、ティルダ→絶対パスの展開については、httpd.confやOSの設定が大きく関係してくるため、そのへんの設定を変えることによってどうにでも変換方式は変更できます。 ですので、もっと詳細を知りたい場合はWebサーバの設定方法やOSのファイル管理システムを勉強されることをおすすめしますが。

harisun
質問者

お礼

ご回答ありがとうございます。 すべてを理解することは今の私では難しいですが、 今回とてもためになりました。 もう少し勉強してみようと思います。 ありがとうございました。

harisun
質問者

補足

ご回答有難うございます。 あともう少し教えていただけますでしょうか。 ”<IMG>タグのSRCで指定するパスは全てURL指定”との事ですが、<FORM>タグのACTIONや<A>のHREFでCGIを呼び出すときも同様と考えてよろしいのでしょうか? よろしくお願い致します。

その他の回答 (3)

  • dany
  • ベストアンサー率35% (27/77)
回答No.4

>、<FORM>タグのACTIONや<A>のHREFでCGIを呼び出すときも同様と考えてよろしいのでしょうか? http上で呼び出すものは全てURL指定です。 ただし、CGI(perlスクリプトなど)の中からカウンタのデータを 呼び出す場合などは違います。http経由ではないですから。 ようするにブラウザ側でなにか実行したりするものがURL指定なのです。

harisun
質問者

お礼

これまた納得いきました。 ありがとうございます。

  • dany
  • ベストアンサー率35% (27/77)
回答No.3

あぁ~今はそんな講座があるんですね。 個人的にはお金を払って覚えるようなものではないと 思うんですが、まぁそれはどうでもいいことですね。^^; ・URL指定 httpで呼び出す時の場所指定。 ・絶対指定 パスを頭から全部書くもの。 URLなら「oshiete.goo.ne.jp」とサーバー名から、 telnet、ftpとかなら「/」から始まるもの。 ・相対指定 現在いる場所から戻ったり、現在地の中から先の場所。 URLなら「../」とか「cgi-bin/count/」、 telnet、ftoなども同様。 cockyさんが詳しく書いてらっしゃいますが、もちょっと 簡単に言うと 「/usr/home/~」はwebサーバーで公開されているディレクトリ ではないから「/~s100000/~」と書く必要があるということです。 その理由は「一般公開したくない場所まで公開することになる」 というセキュリティ上の問題。もちろん「/usr/home~」から公開 することも可能ですがセキュリティ上好ましくありません。 なんとなくわかっていただけましたか? さらに詳しいことが 知りたい場合はApache関係のサイトを見たりするといいかも。

参考URL:
http://www.apache.or.jp/jdocs/conf/documentroot.html
harisun
質問者

お礼

なるほど、セキュリティー上の問題があるからなんですね。 そう言われると納得できます。 ありがとうございました。

回答No.1

よくわかんないです。 しかし、その一だと、相対パスになってしまいませんか? カウンターを表示するHTMLかなんかのファイルが、 トップのディレクトリ(wwwというフォルダの中?)にあるなら、 多分、二つを絶対パスで書くと、その一は、 http://www.(サーバーホスト名)/usr/home/www/s1000000/cgi-bin/counter.pl?NAME=username&KETA=4 という風に、解釈されて、 その二は、 http://www.(サーバーホスト名)/s1000000/cgi-bin/counter.pl?NAME=username&KETA=4 になると思いますが…。 だからその2のように書けばよいのでは? うーん。私、思い違いをしていますか?

harisun
質問者

お礼

どうもありがとうございます。 パスって難しいですよね。 もうちょっと勉強しようと思ってます。

関連するQ&A

  • Perlのパス

    レンタルサーバーのCGIの説明で、「1.perl のパスは、/usr/bin/perl です。2.プログラムの先頭の記述は必ず、#!/usr/bin/perl となります。」って書いてあるんですけど、これを使用する場合、 http://www.kent-web.com/data/cart.html たぶん、admin.cgi , cart.cgi , order.cgi を エディタ で開いて以下の箇所をあたまの部分、#!/usr/bin/perl を変えればいいんですかね?それで1.の/usr/bin/perl は何処に書くのかな?それとも説明 の前置きですかね?「1.perl のパスは、」という意味はリンクがこうなるよ!って意味ですかね? ただま、KENT WEBみながら苦戦してます。 シロウトですいません。

    • ベストアンサー
    • Perl
  • 相対パスについて

    初歩的なことですみません。 相対パスについて教えてください。 <public_html>---<cgi-bin>---<ccc>---<ttt.pl> *************| *************---<eee>---<test.html> こちらの構成で、(***は無視してください。) (public_htmlの下はcgi-binとeeeフォルダです。) test.htmlから見た、ttt.plのパスは ../cgi-bin/ccc/ttt.pl  でよいのでしょうか?? CGIを設置する時、ディレクトリを変えたら、動かなくなってしまったので・・・ 宜しくお願いします。

    • 締切済み
    • CGI
  • カウンターの画像が表示されない

    無料カウンターの画像が「×」になります perlパスはusr/bin/perlです。 indexと同じ階層にdaycounterのフォルダをおきました。パーミッションはサーバーの方が HTML画像ファイル604 CGI実行ファイル700 CGIデータファイル600 .htaccessファイル604 ディレクトリ705 index.html ┃ daycounterフォルダ(755)   ┃   img1フォルダ(701)━gif画像(604)   ┃   img2フォルダ(701)━gif画像(604)   ┃   cgi-lib.pl(600)   ┃   counter.html(604)←使用しないそうです   ┃   daycounter.cgi(700   ┃   daycounter.dat(600)   ┃   gifcat.pl(600) そこのapeboardの設置を参考にしました。 http://www.lolipop.jp/?mode=faq&state=detail&genreid=6&faqid=000120 imgフォルダだけバイナリで転送してあります。 カウンターのソースは <IMG src="http://127.0.0.1/yoshi/public_html/free_cgi/counter/daycounter/daycounter.cgi?mode=total"><P> 本日:<IMG align="absmiddle" src="http://127.0.0.1/yoshi/public_html/free_cgi/counter/daycounter/daycounter.cgi?mode=today">  昨日:<IMG align="absmiddle" src="http://127.0.0.1/yoshi/public_html/free_cgi/counter/daycounter/daycounter.cgi?mode=yesterday"> です。

    • ベストアンサー
    • CGI
  • Postfixでメールを受信したらPerlスクリプトを実行したい

    Solaris10で構築したサーバにて、ユーザー宛のメールを受信したら Perlで記述したスクリプトを実行したい為、下に記載の手順1及び2の 方法で受信メールを渡すパイプを記述したのですがスクリプトが実行されませんでした。 手順1,2共に他のメールアドレスへ転送させた場合、メールの転送は正常に行われました。 メールを受信したらPerlスクリプトを実行するには、どのように設定すればよいのでしょうか? main.cfやmaster.cfに更なる設定の記述が必要なのでしょうか? 主な環境は下記の様になっているのですが不足がありましたら御指摘下さい。 申し訳ありませんがよろしくお願いします。 【手順1】~/.forwardによるスクリプト起動     (1)~/.forwardに、下記の様な記述をしましたがスクリプト起動せず。 (.forwardの記述)        (パターン1) \username,"|/home/username/test.pl"        (パターン2) "|/home/username/test.pl"        (パターン3) |"/home/username/test.pl"        (パターン4) "|/usr/local/bin/perl /home/username/test.pl"        ※下記のような転送は処理されました         \username,username@test.ne.jp 【手順2】main.cf修正によるスクリプト起動     (1)/usr/local/etc/postfix/main.cfに下記行を作成       alias_maps = hash:/usr/local/etc/postfix/aliases,hash:/usr/local/etc/postfix/usr_alias       (usr_aliasの記述) username: :include:/home/username/include       (includeの記述) |"/home/username/test.pl"               他に上記.forwardの記述の4パターンを試しましたが全てスクリプト起動せずでした。 【サーバ環境】 OS:Solaris10(Sparc) MTA:postfix-2.5.3 【test.plの内容】 #!/usr/local/bin/perl open(DATA_FILE, "> test_log.txt"); print DATA_FILE "Test_OK!!!\n"; close(DATA_FILE);     ※備考       ・保存場所:/home/username/test.pl       ・パーミション:test.plと/home/username共に777 (オーナはusername) 【main.cfについて】 念のために allow_mail_to_files = alias,forward,include allow_mail_to_commands = alias,forward,include の記述を追加しています。

  • perlパス

    Windows2000機でWebServerを建てたのですが、CGIが認識しません。 WEBサーバーのクライアントソフトはApacheで 普通にHTMLは見れています。 perlをインストールした場所は C:\usr\local で VerはActivePerl 5.8.8.822 for Windows (x86)です。 場所は↑なのでCGIファイルのperlのパスはそのままいじらず、 perlのパスは#!/usr/local/bin/perl です。 一応#!C:/~以下   もやりましたがだめで、 CGIのテキストが表示されています。 色々調べてやったのですがどうもうまくいかず 教えていただけませんか

  • CGIのパス /usr/bin/perl--

    こんにちは。CGIの最初のパス名をusr/bin/perl --と「ーー」をつけないと動かないCGIがあります。「ーー」はなんの意味なんなのでしょうか?

    • 締切済み
    • CGI
  • Perlをcshスクリプトに書きなおしたい

    以下のPerlで書かれたCGIをcshスクリプトに書き直したく思っています。 #!/usr/local/bin/perl # load libraries require ("/usr/local/bin/cgi-lib.pl"); # cancel stdout buffering $| = 1; # header response print "Content-type: text/html\n\n"; print STDOUT "<HTML><HEAD></HEAD><BODY>\n"; &ReadParse; open(COMM, "|./message > ./message.out") || die; $in_text = $in{"Name"}; print COMM "Name: $in_text\n"; ... "Name"という変数名で受け取った文字列を$in_textに代入している ようですが、この辺りの処理、cshではどう書けばよいのでしょうか。

    • ベストアンサー
    • CGI
  • biglobeでperl利用

    biglobeのホームページにcgiを置きたいです。 GsMonというフリーのスケジューラーを設置したいのですが、 既にローカルサーバーでのテストはできています。 GsMon http://www17.ocn.ne.jp/~seiko/ Biglobeサポート http://homepage.biglobe.ne.jp/manual/shiyou/index.html より CGIの呼び出し方 http://www**.biglobe.ne.jp/~ホームページアカウント/xxxxx.pl 利用可能なコマンド 実行パス perl /usr/local/bin/perl とありますが インストール、初期設定時の画面で データディレクトリ (/user など) CGIの実行ディレクトリ (/Gsmon や CGIの呼び出し方[.pl]など実行ファイルは設定してない) ドキュメントルートからのパス の書き方がわかりません。 相対パスやHttpを含むパスを入れてみたのですが500エラーが出てしまいます。 biglobe側もCGIはサポート対象外ですし困ってます。

  • CGIスクリプト 保存用ディレクトリ

    ApacheというWWWサーバーでは、srm.confというファイル内に  ScriptAlias /cgi-bin/ /usr/local/www/cgi-bin/と記述し、かつaccess.confというファイル内に、 <Directory /usr/local/www/cgi-bin> </Directory> という記述を行うことで、/usr/local/www/cgi-bin/というディレクトリがそのCGIスクリプトの保存用ディレクトリになります。 と書いているのですが、どういうことかよくわかりません。srm.confというファイルはあらかじめ、パソコンにはいっているのでしょうか? ScriptAlias /cgi-bin/ /usr/local/www/cgi-bin/と記述しと書いているのですが、何で記述したらいいのでしょうか。 すいませんが、教えてください。

  • UTF-8で書いたperlのパスが正しく読まれない

    元々htmlファイルもcgiファイルもShift-JISで書いていました 英語環境に変えようと、UFT-8にすべくEncordingConverterでファイルを変換しました htmlファイルは文字コード指定も当然UFT-8にし、アップして表示させてみたところ問題なく表示されました しかし、cgiファイルの方が正しく表示されず、perlチェックをしてみたところパスが ・ソ#!/usr/bin/perl となっていました これが原因で正しく表示されなかったようです そこでcgiファイルをテキストエディタで開いてみたのですが、そのエディタ上では #!/usr/bin/perl と本来あるべき正しい表示になっています 文字コードもUTF-8形式になっています どうしれやればきちんと読み取ってもらえるのでしょうか? エディタで開いても「・ソ」の部分が表示されないのでなおしようがなく困っています どなたか解決方法お分かりの方ぜひご教授ください よろしくお願いします

    • ベストアンサー
    • CGI