CでCGIを作に当たって,CGI出力の合間にヘッタやフッタと言った物を挟みたいのですが・・・
[上に]
[前に]
[次に]
サル
1999/09/17(金) 13:21:50
CでCGIを作に当たって,CGI出力の合間にヘッタやフッタと言った物を挟みたいのですが・・・
SSIはサーバーに対する依存度が高いので,他の方法を探しています.
挟み込む対象は「http://〜」と言った仮想アドレスの物を考えていますが,どの様にしたら良いでしょう.
B-Cus
1999/09/17(金) 16:35:10
あなたの質問、抽象的すぎ。具体的に何をどうしたいのか
例をあげてください。あと、OSは何?
> 仮想アドレス
仮想アドレスって何ですか? 具体例をあげてください。
> ヘッタ
ヘッ*ダ*
普通ヘッダやフッタというのは、最初と最後に付けるものを指します。
なので、「CGI出力の合間に」と言われると、何を指して「ヘッダ」
「フッタ」と表現しているのか わからない。
サル
1999/09/17(金) 20:30:50
あやあや、済みません
OSはFreeBSDです。
例えば、<HEAD>〜</HEAD>を「/~test/data/test.dat」
等としたファイルに入れておけば、SSIを使えば「<--#include file="/~test/data/test.dat"-->(だったっけ?)」と出来ますよね。
これと同じ事を別の方法で出来れば良いのですが。
これも抽象的でしょうか?
B-Cus
1999/09/17(金) 20:57:18
#insert header.txt
ほげほげ
#insert footer.txt
などと index.src に書いておいて、head.txt には
<html><head>…</head><body>
として、footer.txt には
</body></html>
と書いておいて、最終的な出力は
<html><head>…</head><body>
ほげほげ
</body></html>
となればよい、ということですか?
で、今はCでどういう書き方をしてるんでしょうか。
# 全部書くのはめんどいので、あなたのソースに付け加える形にしたい。
サル
1999/09/17(金) 22:00:24
近い意味が判ってもらえてこんなに嬉しいと思ったのは始めてです(涙)
私、意思を伝達する能力に欠けているのかしら・・・(TT)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
おおざっぱに言って、フローは以下の通りです。
index.html <--- フレームの設定のみ。以下のCGIを呼び出すだけです。
↓
main.cgi <--- 実質上のHTMLです。但しヘッダの記述は外部に有ります。
↓↑
test.dat <--- ヘッダの記述データです。パスは「/~test/data/」に有ります。
内容は「<HEAD>〜</HEAD>」です。
CGIを「/~test/cgi-bin/」にある場合(これが動くので「/〜」とした記述が必要)、
「fopen()」では「../data/test.dat」はOKですが、
目的の「/~test/data/test.dat」としたパスは無効の様です。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
ソースですが、現在では長いので、略記に成りますが、
main()
{
printf ( "Content-type: text/html\n\n" );
printf ( "<HTML>" );
■■■■ 出力的にココに入れたい ■■■■
printf ( "<BODY>" );
:
( ここには意味無く長いプログラムが・・・(涙))
:
printf ( "<BR><BR></BODY>" );
printf ( "</HTML>" );
}
概略で済みませんがお願い致します。
それと「B-Cus」さん「ヘッタ→ヘッダ」の御指摘有難うございました。「heaDer」ですものね。
かつべ
1999/09/17(金) 22:27:47
FILE *fp
char buf[300];
fp=fopen("heder.dat","r"); /*エラー時の処理は割愛*/
while(fscanf(fp,"%s",buf)!=EOF)
printf("%s\n",buf);
close(fp);
安直ですが、じゃだめなんですか?(^^;
かつべ
1999/09/17(金) 22:28:49
訂正、fgetsの方が安全ですね。失礼。
サル
1999/09/18(土) 15:05:13
かつべさん有難うございます。
おっしゃる方法でファイルを開く事が出来れば、十分な解決方法になります。
「fopen( "../data/test.dat" , "r" )」と言うパスを使っている場合、確かに問題無いのですが、
「fopen( "/~test/data/test.dat" , "r" )」等の様に「/~」やURL等と言った
下位レベルのパスでは無い(実際のパス「c:\〜」とは異なり、サーバーが理論上提供しているパス)場合、
「fopen()」はその所在を理解できない様です。
ふじ
1999/09/18(土) 15:26:21
>「fopen( "/~test/data/test.dat" , "r" )」等の様に「/~」やURL等と言った
>下位レベルのパスでは無い(実際のパス「c:\〜」とは異なり、サーバーが理論上提供しているパス)場合、
>「fopen()」はその所在を理解できない様です。
そりゃそうです。
/~test/data/test.dat
てのは、Webサーバが解釈してくれるものなのだから。
どうしてもそのように書きたければ、(Perl だと LWPのような)
HTTP経由でファイルを GET してくる関数を用意して使うか(私は C は分かりませんが)、
外部の wget 等のツールを叩くか・・・
#でも、同じファイルシステム(サーバ)内にあるファイルに対して
#そういう事をするのは資源のムダ遣いだと思いますが。
ところで、何故 /~test/data/test.dat というような表記をする必要があるんでしょう?
>CGIを「/~test/cgi-bin/」にある場合(これが動くので「/〜」とした記述が必要)、
これ、勘違いでは?
コルン
[E-Mail]
[HomePage]
1999/09/18(土) 15:36:04
>「fopen( "../data/test.dat" , "r" )」と言うパスを使っている場合、確かに問題無いのですが、
>「fopen( "/~test/data/test.dat" , "r" )」等の様に「/~」やURL等と言った
>下位レベルのパスでは無い(実際のパス「c:\〜」とは異なり、サーバーが理論上提供しているパス)場合、
>「fopen()」はその所在を理解できない様です。
本当に"test.dat"のパスは"/~test/data/test.dat"なのですか?
ブラウザからアクセスする場合が、
http://xxx.xxx.xxx/~test/data/test.dat
なのであって、サーバー機内部でのディレクトリィが違うんじゃないんですか?
ちなみに、うちのサーバーだと
http://xxx.xxx.xxx/~test/data/test.dat
のファイルは
/home/test/www/data/test.dat
に成るのですが、、、
(もう一つの方の質問も拝見しましたが、
おそらくサルさんは、
ブラウザ上のパスとサーバー機上のパスを
混同なされてるんじゃないですか?)
B-Cus
1999/09/18(土) 15:36:15
そもそも、相対ディレクトリでやれば(あまり)問題は起こらないはずです。
ファイルの配置、ファイル名のデータ構造の見直しをした方が
いいんじゃないですか?
あるいは
char *url2path(char *url)
とか、
void url2path(char *url,char *path)
などの変換をしてくれる関数を書くのもアリでしょう。
fp = fopen(url2path("/~test/data/test.dat"),"r")
てな感じで使えるのを自分で作る、と。
> 私、意思を伝達する能力に欠けているのかしら・・・(TT)
多分。
「おっしゃる方法でファイルを開く事が出来れば、十分な解決方法になります」
ということが最初からわかってるなら、そう書きましょう。
B-Cus
1999/09/18(土) 15:50:36
> ということが最初からわかってるなら、そう書きましょう。
あ、ちゃんと書いてあるのね。これはおじさんが悪かった。ごめんなさい。
サル
1999/09/19(日) 00:37:53
[[解決]]
ふじさんルコンさんお返事有難うございます。
ですから、混同していると言うより、上位のパスを承知していたから苦労していたのですよ。
B-Cusさんお返事有難うございました。
今回、関数を噛ませてパスを得ると言うことでご提案頂き有難うございました。
この方法が確かに決定打かもしれません。●●
最初から「fopen()の問題」と書けなかったのは、この問題がSSIでも解決できる様に、C以外のルートの解決案も期待したかった為でも有ります。
皆さんには、ご迷惑の掛けどうしで恐縮しています。有難うございました。
[上に]
[前に]
[次に]