アプリ版:「スタンプのみでお礼する」機能のリリースについて

わたしはあるインターネットのスクールに通っていたのですが
パスについて頭が混乱しています。
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)では動作しないのですか?
パスの根本的なところを知りたいです。

どなたか教えていただければ幸いです。

A 回答 (4件)

話が専門的になりますがお覚悟を。


一応環境として、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のファイル管理システムを勉強されることをおすすめしますが。

この回答への補足

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

よろしくお願い致します。

補足日時:2001/03/09 00:20
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/09 12:37

>、<FORM>タグのACTIONや<A>のHREFでCGIを呼び出すときも同様と考えてよろしいのでしょうか?



http上で呼び出すものは全てURL指定です。

ただし、CGI(perlスクリプトなど)の中からカウンタのデータを
呼び出す場合などは違います。http経由ではないですから。

ようするにブラウザ側でなにか実行したりするものがURL指定なのです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/09 12:34

あぁ~今はそんな講座があるんですね。


個人的にはお金を払って覚えるようなものではないと
思うんですが、まぁそれはどうでもいいことですね。^^;

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

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

お礼日時:2001/03/09 12:28

よくわかんないです。



しかし、その一だと、相対パスになってしまいませんか?
カウンターを表示する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のように書けばよいのでは?

うーん。私、思い違いをしていますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/03/09 12:40

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