CGI: Common Gateway Interface part 11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/14 22:26ID:F9qlqHNx※CGIは特定の言語に依存するものではありません。
Perlのコーディングに関する質問は、専用スレでお願いします:
[Perl 初心者コーナー Part24]
http://pc2.2ch.net/test/read.cgi/php/1054992610/
CGIとPerlの区別がわからない、という人はとりあえずこちらへ:
[WebProg 初心者の質問 Part3]
http://pc2.2ch.net/test/read.cgi/php/1045091733/
過去ログ・関連スレッドは >>2-5 あたりに
0245nobodyさん
03/08/04 23:18ID:???>画像の生データをHTMLの途中に流し込んで、って言うのが
無茶もいいところ。
GDだって「HTMLの途中に流し込」むなんてできんだろ。
というかHTMLを0から勉強した方がよさげ。
0246nobodyさん
03/08/04 23:20ID:???>というかHTMLを0から勉強した方がよさげ。
というかHTMLとHTTPを0から勉強した方がよさげ。
0247224
03/08/04 23:50ID:???画像吐き出すスクリプトを別にするなり再帰なり、何しろ別のプロセス
から吐き出して<IMG src=""〜>で呼ぶってのならできるんでしょうが、
まあ、言われなくてもいろいろ勉強中ですわ。
ほんじゃ
0248nobodyさん
03/08/05 00:56ID:???0249nobodyさん
03/08/05 01:08ID:???0250nobodyさん
03/08/05 01:18ID:???JavaScriptでローカルファイルを表示させる方法もあるのだが
教えるのは辞めておこう。
0251nobodyさん
03/08/05 01:26ID:???バイナリ埋めこんでそれを実行しようとしているようなもんだな
0252224
03/08/05 02:03ID:???GDができないんじゃなくて、HTMLをそうできないようにしてるから
できなんだと思います。
GDの出力をWEBページの一部として表示することは、
ホントにできませんか?
>>248
いえいえ、お相手ありがとうございました。
>>249
そうよばれたのは初めてです。ちゅうか、その方とは違うと思います。
>>250
いや、どうも伝わってないようですが、ローカルファイルを表示
したいわけじゃないんです。
>>251
いえ、テキストファイルじゃなくて画像ファイルって言ってるんですが、
どうも誤解させたようで、申し訳ありませんでした。
皆様に幸あれ。
0253nobodyさん
03/08/05 02:31ID:???ちゃんとレス嫁馬鹿者。
>>251が言ってる
>コイツの言っている事は、テキストファイル中に実行可能ファイルの
>バイナリ埋めこんでそれを実行しようとしているようなもんだな
は合ってるだろ。
>いえ、テキストファイルじゃなくて画像ファイルって言ってるんですが、
ほんっっっとに馬鹿だな。日本語勉強しろ。
お前はHTML(テキストファイル)の中に画像(バイナリ)を埋め込みたいと言ってる。
そりゃ実行できるわけないだろ。(まあ見えなくは無いが文字化けみたいになるわな)
ついでに
>GDができないんじゃなくて、HTMLをそうできないようにしてるから
>できなんだと思います。
どうすればHTMLにバイナリを埋め込んで表示できるんだ。
>GDの出力をWEBページの一部として表示することは、
>ホントにできませんか?
だから<img src="〜">ならできるっつってんだろ。
その時のresponse headerはContent-Type: text/htmlじゃなくてContent-Type: image/(jpeg|gif|etc.)で
message-bodyはその画像のみだ。
HTMLとHTTPを0から勉強しなおせ。
というか、人の話を聞かないようならプログラムやめろ。マジで。
0255nobodyさん
03/08/05 03:37ID:???ただ、画像サイズがデカくなると、htmlのサイズ自体も脹れ上がるからお薦めはせんし実装しようとも思わんけどな・・・
というか、GDやらしってて、この程度の発想がでてこんのが不思議であるわけだが・・・
0256nobodyさん
03/08/05 10:21ID:???0258nobodyさん
03/08/05 13:34ID:???while($a eq $b || $a eq $c || $b eq $c){
$a = int rand 10 ;
$b = int rand 10 ;
$c = int rand 10 ;
}
これでいいの?
他になんかスマートな書き方ある?
0259nobodyさん
03/08/05 13:46ID:???読み込むことってできるんですか?
0260nobodyさん
03/08/05 14:21ID:???永久ループになる可能性が 0 ではないので不可。
@seed = (0..10);
($a,$b,$c) = (splice(@seed,rand($#seed),1),splice(@seed,rand($#seed),1),splice(@seed,rand($#seed),1));
みたいにしてみる。
# ただし同じ数字が連続しない乱数は乱数ではありませんので。
>>259
できまーす。
0263nobodyさん
03/08/05 16:02ID:???「ただいま処理中です」
と表示させておいて、処理が完了したら別ページに飛ばす
(処理完了が書かれたHTMLを表示する)
というCGIを作りたいと思っているのですが、
どうもうまくいきません。。
バッファのフラッシュを考えたのですが、
最後に別ページを表示するので、ちょっと違うかなと思いました。。
こんなイメージです。
print "Content-Type:text/html\n\n";
print "loading...";
sleep(10); # ここが重い処理と想定
print "Location:$URL\n\n";
exit;
この通りではいかないのはわかっておりますが、
他に方法がないものかと思っております。。。
この処理自体、Perl-CGIではできなかったりしますかね(汗
0266263
03/08/05 17:35ID:???( ´・ω・`) ありがとう…。
HTTPヘッダの問題ということは、
言語に関わらず無理ということですね・・・。
(ASPで同様のことをやっていたのを見たことがあるのですが、
あれは何か特殊なことだったのでしょうか・・・)
0267nobodyさん
03/08/05 17:43ID:???2. バッファリングをせずに垂れ流し、処理の最後にJavaScriptのdocument.writeでHTML書き直し。
3. 2.のdocument.writeの代わりにlocationで別HTMLにジャンプ。
これぐらいしか思いつかないや
0269nobodyさん
03/08/05 17:58ID:???昔仕事でそんなようなことやってた。
そのときは、まずsubmitされたデータをhiddenなりで埋め込んだ
「ただいま処理中です」ってページを表示、
そのページのonloadでhiddenのデータをsubmitって感じでやってた。
その際、ブラウザがタイムアウトしないように改行か何かを定期的にflushして、
プログラム側(というかhttpd側?)もタイムアウトしないように
XSモジュールでスレッドとイベント作って、指定時間でraise(SIGINT)
みたいなことやってたな。<俺は関与してない
1. 入力画面
↓何らかのデータ送信
2. 送信されたデータをhiddenで埋め込んだ「処理中」ページをとりあえず表示
↓onloadで本当に処理させるページへsubmit
↓サーバで重い処理
↓定期的にタイムアウト対策
↓処理終了
3. 結果画面
って感じ。
0270nobodyさん
03/08/05 18:28ID:???0271nobodyさん
03/08/05 18:49ID:???0272263
03/08/05 20:11ID:???BODYタグのonLoad もしくは、
最後にJSでlocation.href変更スクリプトを吐き出しにしたところ、
なんとかそれっぽい感じにはなってきたんですが、
バッファリングされたりされなかったりしちゃいます。。。
#! /usr/bin/perl
$| = 1;
print "Content-Type:text/html; charset=EUC-JP\n\n";
print "<HTML><BODY>";
print "読み込み中";
print "</BODY></HTML>";
sleep(5);
print <<EOF;
<script language="javascript">
document.location.href='http://www.yahoo.co.jp/';
</script>
EOF
exit;
いくときといかないときがあるということは、
バッファリング自体怪しいかなぁ・・・
0273263
03/08/05 20:36ID:???0274263
03/08/05 20:57ID:???#! /usr/bin/perl
$| = 1;
print <<HTML_DATA;
Pragma: no-cache
Cache-Control: no-cache
Content-Type:text/html; charset=EUC-JP
<HTML>
<BODY onLoad="document.location.href='index.html';">
読み込み中
</BODY>
</HTML>
HTML_DATA
print( "\n" x 8192 );
sleep(5);
exit;
ただ、WinのNN6.2, IEでは確認とれたのですが、
Macとなると、両方ともダメでした。。。
0275nobodyさん
03/08/05 21:06ID:???0277初心者
03/08/05 22:00ID:rGA945yM質問なんですが、自分iswebで無料ホームページを作っているのですが、
cgiについてよくわかりません。
パーミッションを変更してアップロードするだけでいいのですか?
0278nobodyさん
03/08/05 22:17ID:???まずは勉強しんしゃい。
http://dir.yahoo.co.jp/Computers_and_Internet/Internet/World_Wide_Web/CGI___Common_Gateway_Interface/Guides_and_Tutorials/
0279nobodyさん
03/08/06 00:43ID:s3UpSeM9フレームは使用禁止ですか?
フレームページに隠しフレームと見えるフレームをつくる
隠しフレームのソースは重い処理をしたいCGIにする。で処理終了したら
リダイレクトするか、winodow.top.location.href = "index.html";を書き出す。
で、見えるではフレームにお待ち下さいの表示をしておく。
これで上手くできないかな??
0280279
03/08/06 00:44ID:???0281nobodyさん
03/08/06 01:03ID:pv8vzu63http://homepage3.nifty.com/coco-nut/
0282nobodyさん
03/08/06 01:12ID:9HRAagYphttp://endou.kir.jp/marimo/link.html
0284nobodyさん
03/08/06 09:23ID:???10秒も20秒もかかるの
0285263
03/08/06 10:01ID:???フレームは特に使用しても問題ないです。
その方法は結構スマートですね。
ちょっと試してみたいと思います。
>>283
フォームからCGIを呼び出して、
処理中にお待ちくださいを表示するので、
一度Locationで、hiddenを持たせたお待ちくださいHTMLを
表示して、onLoadでSubmitしてもいいかもしれません。
(この辺はブラウザ依存を要調査ですね
できれば依存を気にしなくてもできるスクリプトが望ましいです。
>>284
通信処理というより、通信経路で時間をとられるといったほうが正しいかもしれません。
みなさん色々と参考になります。
ありがとうございます。
0286263
03/08/06 10:03ID:???○重い処理というより、
でした・・・
0287263
03/08/06 13:23ID:???▼index.html
<FRAMESET rows="0,*">
<FRAME src="process.cgi" >
<FRAME src="loading.html">
</FRAMESET>
▼loading.html
<HTML>読み込み中</HTML>
▼process.cgi
print <<HTML_DATA;
<HTML>
<BODY onLoad="window.top.location.href='done.html';">読み込み中</BODY>
</HTML>
HTML_DATA
sleep(10);
exit;
▼done.html
<HTML>読み込み完了</HTML>
この場合、エラー内容を元にページを振り分けたり、
値を引き継いだりでまた問題が出そうですが・・・。
とりあえずこの方法が一番よさそうな気がします。
0288nobodyさん
03/08/06 18:52ID:???hoge.foo.co.jp
で取得することはできますか?
ただし、両者は互いに別のサーバ上にあります。
テストしてみろといわれそうですが、
今まだ環境が用意できてないもので・・・
0291nobodyさん
03/08/06 23:53ID:I44XWNV5できそうだなあ。
えーと。
クッキーを作る時にそれが有効になるドメインを指定できる。
指定しなければ、作成したドメインがそれになる。
ドメインを自分で指定した場合、>>288のようなことが可能になる。
0292nobodyさん
03/08/06 23:56ID:???0293nobodyさん
03/08/07 02:12ID:???0296nobodyさん
03/08/07 20:10ID:???domain=.foo.co.jp;
でクッキーを発行すればwww.foo.co.jpとhoge.foo.co.jpで同じクッキーをやり取りできるはず。
domain属性が廃止されてなければ。
http://wp.netscape.com/newsref/std/cookie_spec.html
>>295
今はそうなったの?
0297nobodyさん
03/08/07 21:18ID:???>でクッキーを発行すればwww.foo.co.jpとhoge.foo.co.jpで同じクッキーをやり取りできるはず
これで正解。いったいここは何の板なのかと思ってしまう・・・
0298nobodyさん
03/08/08 11:27ID:???cgiをコマンドラインからでもテストできるようにしようと思って、
変数をデコードする部分を、
my($method) = $ENV{'REQUEST_METHOD'};
if ($method eq 'GET') {
$query = $ENV{'QUERY_STRING'};
}
elsif ($method eq 'POST') {
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
#★コマンドラインからのとき
else{
$query = $ARGV[0];
}
にして、
foo.cgi key1=name=1&key2=name=2&key3=name=3&key4=name=4&key5=name=5
とコマンドラインからやってみたのですが、
'key2' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'key3' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'key4' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'key5' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と言われてしまいます。どうすればいいのでしょうか?
0299nobodyさん
03/08/08 13:13ID:???perl foo.cgi key1=name=1&key2=name=2&key3=name=3&key4=name=4&key5=name=5
は?
0300nobodyさん
03/08/08 17:35ID:???「Location:http://www.aaa.com/hoge.cgi\n\n」
として別のサーバにリダイレクトさせ、
そのcgiにアクセスすると、
「Location:http://www.bbb.com/fuga.cgi \n\n」
として別のサーバにリダイレクトさせ、
さらにそのcgiにアクセスさせると、
「Location:http://www.ccc.com/hage.cgi \n\n」
として・・・
というのように複数回リダイレクト(まぁ、多くても3回の予定ですが)することを考えているのですが、
これに関して、何回までという制限はあるのでしょうか?
また、このように複数回リダイレクトするときに、何かしら制限やら注意事項というのはありますか?
(もちろん、無限ループしないようにはします)
0303nobodyさん
03/08/09 02:11ID:???Locationヘッダを解釈するのはクライアント側だから、ブラウザ次第じゃない?
>>298
foo.cgi "key1=name=1&key2=name=2&key3=name=3&key4=name=4&key5=name=5"
0305nobodyさん
03/08/09 11:32ID:???0306nobodyさん
03/08/10 09:53ID:???素人っぽい質問している>>298さんに勧めているので、
自称スーパーハカーの>>304さんには勧めてませんよ。
せっかくですから、>>304-305さんは好きなだけ車輪の再発明に勤しんでください。
0308nobodyさん
03/08/10 11:50ID:???お前は帰んなくていいから、デテクンナ
0309nobodyさん
03/08/10 12:29ID:???0310nobodyさん
03/08/10 14:17ID:???0311nobodyさん
03/08/10 21:18ID:???0312nobodyさん
03/08/11 00:31ID:???0313nobodyさん
03/08/11 00:49ID:???0314nobodyさん
03/08/11 09:54ID:???0315nobodyさん
03/08/11 16:44ID:1GxglH9k&cookie_regist('foo','fooid!123456',5);#5日間有効な(fooという値の)クッキーをセット
&cookie_read('foo'); #fooという値のクッキーを読み取る
print "Content-type: text/html\n\n";
print qq|\$cookie{'fooid'} is $cookie{'fooid'}|;
で、クッキーを書きこんで読み込んで表示させる簡単なスクリプトなんですが、
(もちろん、cookie_regist と cookie_read 関数は別の所にあります)
IEで、クッキーを全削除して、そのページを表示させると、
1回目はクッキーが表示されず、
リロードすると2回目以降はクッキーが表示されます。
これって、クッキーの仕様なんでしょうか・・・。
(以前に発行されたクッキーは読めるが、
同じhttpアクセス内で発行されたクッキーは、
そのアクセス内では読み取れないという、ことなんでしょうか?)
0316nobodyさん
03/08/11 16:53ID:???ヘッダが終了しないとクッキーがセットされないんじゃない?
つまり1行目でクッキーを送信してるけど、実際は3行目で\n\nとしてヘッダを
完結させてやるまでクッキーのセットが保留されているのかも。
クッキー読み込みを表示の直前にして再度試してみて。
0317316
03/08/11 17:02ID:???見てるだけだから、発行して同時に取得はできないのかもしれない。
発行した場合はクッキーを読まずに、その発行したデータをそのまま使うように
すればいいと思う。または$ENV{HTTP_COOKIE}を自分で書き換えちゃうとか。
0318nobodyさん
03/08/11 17:34ID:???Cookieの読み出しはブラウザからのリクエスト時に送られてくる
Cookieヘッダ(HTTP_COOKIE)から行う。
Cookieの書き出しはサーバからのレスポンス時に送る
Set-Cookieヘッダで行う。
この仕組みを考えれば明白だろう。
Cookie仕様書
ttp://wp.netscape.com/newsref/std/cookie_spec.html
日本語訳
ttp://www.futomi.com/lecture/cookie/specification.html
0319nobodyさん
03/08/11 19:33ID:2ChtRC4J柔らかくて揉み心地のよさそうなオッパイの持ち主です。
上のお口と下のお口をフルに使っての4Pシーンは見所満載!
オマンコの奥深くに突き立てられていくチンチンが気持ちよさそうです。
無料ムービーはここから
http://www.exciteroom.com/
0320_
03/08/11 19:44ID:???0321_
03/08/11 19:45ID:???0322_
03/08/11 19:48ID:???0323315
03/08/11 23:16ID:???なるほど、よく理解しました。
やっぱ、表面的な知識じゃ、こういうときぼろがでるね。
>>318
Cookie仕様書は英文で、なんとか読んでた(でも半分くらいしかわからず)んだけど、
日本語訳があったとはしらなんだ。ありがとうございます。
0324nobodyさん
03/08/12 09:39ID:???<a href="foo.cgi?hoge=fuga&hage=tara">リンク</a>
みたいにリンクするとき、
正しい書式は
<a href="foo.cgi?hoge=fuga&hage=tara">リンク</a>
じゃなかったでしたっけ?
ネスケ7.1(Win版)で試したら、前者は思い通りの動作して、
後者は思い通りの動作をしてくれなかったもので
(hoge=fugaをうけとってくれなかった)
なんか自分、他のことと勘違いしてます?
すくなくとも、html中の特殊文字を書くときと、
hiddenフィールド内に書くときは、&で正しいかったかと思いますが・・・
0325nobodyさん
03/08/12 09:57ID:???0326nobodyさん
03/08/12 10:16ID:???&amp;が正しい。
(アンパサンドは便宜的にいわゆる全角)
でも、そもそも、自分でCGI組んでいるんだったら、
アンパサンドじゃなくてセミコロンを区切りにすればいいのに。
0327nobodyさん
03/08/12 10:48ID:???MSのサイトはたまにセミコロンになってるのあるなぁ。
0328nobodyさん
03/08/12 11:15ID:???0329nobodyさん
03/08/12 12:53ID:???0330nobodyさん
03/08/12 14:25ID:???一瞬PATH_INFOってことかと思ったが、
hoge.cgi?key1=value1/key2=value2/key3=value3
ってやると
QUERY_STRING: key1=value1/key2=value2/key3=value3
PATH_INFO: (null)
ってなるのか(Apache)。
しかし、ブラウザでフォームの送信すると & で繋がってくるわけだから
別の文字にするのはなんか嫌だな。
0331nobodyさん
03/08/12 15:57ID:???0333nobodyさん
03/08/12 17:50ID:???http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html401j/appendix/notes.html#h-B.2.2
0335nobodyさん
03/08/12 18:59ID:???古い仕様はたぶんこの先もずっと引きずりつづけるから、面倒だね。
0336nobodyさん
03/08/12 19:38ID:???現状の殆どのブラウザはフォームの内容を送ってくるときにアンパサンドで繋ぐよ。
GETもPOSTも同じ。multipartは別だけど。
0337324
03/08/13 01:56ID:???も&で表示されちゃうのね。。。しらなかった。
ところで、実は、(>>324だと両者が同じためわからないと思うので再掲しますが)
ネスケ7.1(Win版)で、
<a href="foo.cgi?hoge=fuga&hage=tara">リンク</a>
が正常に動いて、
<a href="foo.cgi?hoge=fuga&amp;hage=tara">リンク</a>(←便宜上アンパサンドは全角)
で正常に変数をうけとってくれないのですよ。。。
よくある一般的な、
$query = $ENV{'QUERY_STRING'};
local(@query) = split(/&/, $query);
foreach (@query) (以下略)
{でやってるんですが・・・
ネスケのバグなのか、あるいは自分のスクリプトがどっかおかしいのか。。。
0338324
03/08/13 01:57ID:???レスくれたみなさん、ありがとうございます。
W3Cがセミコロン推奨してるとは、しらなんだ・・・
0342nobodyさん
03/08/13 02:30ID:???HTMLの文字実体参照 &lt; とか &amp; とかと、
URLに変数を埋め込む時のやりかたとが、
ごちゃまぜになってないかい?
0343nobodyさん
03/08/13 04:05ID:???&
<
>
"
♠
♣
♥
♦
■ このスレッドは過去ログ倉庫に格納されています