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 あたりに
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:???&
<
>
"
♠
♣
♥
♦
0345nobodyさん
03/08/13 11:34ID:???だから実体参照を意識しなくちゃならないアンパサンドよりも
セミコロンを使った方が常に楽だと思う。
CGIモジュールを使わないにしても、
my @query = split(/[&;]/, $query);
んな風に書き換えるだけでいいから、移行も楽だし。
0346324
03/08/13 13:41ID:???え、同じじゃないんですか?
たとえば、
<input type="hidden" name="hoge" value="1<>2<>3">
は間違いで、
<input type="hidden" name="hoge" value="1&lt;&gt;2&lt;&gt;3">
が正しいですよね?
だから、URLに変数を埋め込むときも、
foo.cgi?hoge=1&lt;&gt;2&lt;&gt;3
がただしいと思ったんですけど・・・
0347nobodyさん
03/08/13 13:44ID:???0348nobodyさん
03/08/13 13:52ID:???問題の切り分けをきっちりしないと、いつまで経っても進まんよ。
HTML上&と書くのは正しいし、Navigator7.1で
他の人は問題ないって言っているよね。
最低限再現するソースを用意してみればいいんでない。
問題があると*思い込んでいる*箇所だけじゃなくて全部。
0350nobodyさん
03/08/13 14:38ID:???<input type="hidden" name="hoge" value="1<>2<>3"> も
<input type="hidden" name="hoge" value="1<>2<>3"> も
正当なHTML。間違いではない。
が、後者のように記述するよう推奨されている。
~~~~~
双方とも、foo.cgi?hoge=1%3C%3E2%3C%3E3 として送信される。
< と > は、RFC2396 http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt
が定める予約文字でも非予約文字でもないので
%xx 形式にエスケープされて送信される。
<a href="foo.cgi?hoge=1<>2<>3"> も
<a href="foo.cgi?1<>2<>3"> も
HTMLの属性値としては正当。
が、%xx 形式にエスケープされてないので、URLとしては不正。
0351324
03/08/13 14:39ID:???うーん、Perlでhtmlをprintしている途中で、
-------------------------------------------------------------
my $HtmlSubsidy_exam_intro;
if (($FlagSoudan == 1) && ($in{'q' . $sw2_num} == 1)){
foreach $key (sort keys %in){
$HtmlSubsidy_exam_intro .= qq|$key=$in{$key}&|;
}
$HtmlSubsidy_exam_intro = qq|
<script language="JavaScript">
window.open('./?|.$HtmlSubsidy_exam_intro.qq|mode=intro','','toolbar=no, width=510, height=170');
</script>
|;
-------------------------------------------------------------
ってなかんじです。(JavaScriptはここでしか用いてません)
これだとネスケ7.1で正常に動作して、
$HtmlSubsidy_exam_intro .= qq|$key=$in{$key}&|;
のところの&を&amp; にすると、値をちゃんとよんでくれないんですよね・・・。
ところで、本来だと&amp;でサーバに渡して、
local(@query) = split(/&/, $query);
で処理できるわけですが、&amp;から&への変換(?)は、
どこでどのタイミングで行われてるのでしょうか?
Apacheがクエリーストリングを受け取った瞬間?
0352324
03/08/13 14:45ID:???1分差で、>>350さんが答えてくれましたね。
ありがとうございます。
RFC2396 さらっと見しましたが、とりあえず、理屈はわかりました。
これからじっくり読んでみます
0353nobodyさん
03/08/13 14:57ID:???Netscape7.1の問題じゃなくて、>>324=>>351の
スクリプトがおかしい。
ところで、セミコロンに変えるのを試していれば、
すぐに解決してたような。
0354324
03/08/13 15:59ID:???>>>353さん
>とりあえず解答は出たね。
いや、&だと正常に動作して、
&amp;だと正常に動作しない(値をちゃんとよみとってくれない)んです。。。
つまり、本来と逆のように思われるのです。
もしスクリプトがおかしいとしたら、
どこがおかしいかご指摘していただけますでしょうか?
0355nobodyさん
03/08/13 16:01ID:???「初心者」という文字列を含む名前をエラーではじきたいのですが、
どうすればいいでしょうか?
一応、「初心者」であればエラーを返すようにしています。
if ($i_nam eq "初心者") { &error("任意の名前でお願いします"); }
この場合だと「PC初心者」をはじくことができません。
正規表現を使わなければいけないというのはわかっているのですが、
if ($i_nam =~ /初心者/)
ではダメなんでしょうか?
よろしくお願いします。
0357355
03/08/13 16:12ID:???http://pc2.2ch.net/test/read.cgi/php/1059043704/l50
へ逝きます。
0358nobodyさん
03/08/13 16:33ID:???& → & の変換はHTMLの話。JavaScriptとは関係ない。
HTML
<a href="foo.cgi?hoge=1&huga=2&hage=3">
リンククリック時に foo.cgi?hoge=1&huga=2&hage=3 として送出。
JavaScript
location.href = "foo.cgi?hoge=1&huga=2&hage=3";
実行時に foo.cgi?hoge=1&huga=2&hage=3 として送出。
locationと同様、window.open() の第1引数(URL値)に含まれる & が
& に変換されないのはJavaScriptの仕様。
Netscape謹製のブラウザで正しく動作しないのは当たり前。
そして、既にこの時点で板違い。→ Web制作 http://pc2.2ch.net/hp/
0359nobodyさん
03/08/13 18:47ID:???&amp;って書けばええよ。
0360nobodyさん
03/08/13 18:55ID:???0362nobodyさん
03/08/13 20:09ID:kY5HHstyApacheを1.3.27から2.0.47にアップグレードした所
あるPerl/CGIが極端に重くなってしまいました。
5分経っても表示されない、という感じなのです。
いろいろ見たところ、
#!/usr/local/bin/perl -w
と-wフラグをつけたモノだけが遅いので試しに外してみたら
サクっと表示しました。
Apache/1.3.27の頃はつけようがつけまいが問題なかったものです。
原因によってはスレ違いかもしれませんが、
原因が皆目見当が付きません。
どなたか心当たりのある方いらっしゃいませんか?
0364nobodyさん
03/08/13 21:46ID:???-w ってけっこう厳しく警告をだすためのフラグだっけ?
実行しているソースから警告がでまくっていて処理が遅いと
そんな感じだと思われ
0365362
03/08/13 21:54ID:???ホンチャンサーバでは問題なく動いているのです。Apache/1.3.26 (Unix)
テストサーバもApache/1.3.27 (RedHat)の時は問題なく動いてました。
Apache/2.0.47にした途端の症状なのです。
-w付きでチェックしてもシンタックスおっけなんです。
-w外すと問題なく動きます。
0366nobodyさん
03/08/13 23:16ID:???さあ?Perl が出力するログをトラップしてerror_logに出力するのに、
Apache2.0では時間がかかるようになったとしか漏れの頭では思いつかないけど。
普通にコマンドラインから # perl hoge.cgi としても実行結果が遅いのか?
それか -wって警告を多めに出すだけだからはずせば?
0367364
03/08/13 23:18ID:???すんません、この話にレスするのもうやめます
0368324
03/08/14 01:32ID:???>locationと同様、window.open() の第1引数(URL値)に含まれる & が
>& に変換されないのはJavaScriptの仕様。
>Netscape謹製のブラウザで正しく動作しないのは当たり前。
なるほど、これですごい納得しますた。ありがとうございました。
0371nobodyさん
03/08/14 10:43ID:???<a href="affiliate.cgi?partner=http://www.abc.net/&location=http://www.foo.jp">りんく</a>
っていうのは、正しいですか?
>>350さんがあげてる
FC2396 http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt
を読んだものの、いまいち意味が理解できず・・・
0372nobodyさん
03/08/14 12:55ID:???Set-Cookie: $cookiename=$cookievalue; の$cookievalueの部分って、
文字長に制限はあるのでしょうか?
http://www.futomi.com/lecture/cookie/specification.html
にある仕様書を見る限り、なにも文字長については書いてないようですが。
0373371
03/08/14 13:15ID:???ただしくは、
<a href="affiliate.cgi?partner=http%3a%2f%2fwww.abc.net%2f&location=http%3a%2f%2fwww.foo.jp">りんく</a>
ですね、失礼しました。
0374nobodyさん
03/08/14 20:13ID:???HTMLは
>>350から引用
>ちなみに
><input type="hidden" name="hoge" value="1<>2<>3"> も
><input type="hidden" name="hoge" value="1<>2<>3"> も
>正当なHTML。間違いではない。
>が、後者のように記述するよう推奨されている。
> ~~~~~
引用終わり
だと思われ。
0375nobodyさん
03/08/14 20:54ID:???たしか1024文字まで。
ただし、「$cookiename=$cookievalue;」 ←これを全部含めて1024文字までだと思った。
つまり、= とか ; とか クッキーの名前 とかもその制限に入る。
たしか。
0376nobodyさん
03/08/14 22:16ID:???ttp://www.futomi.com/lecture/cookie/specification.htmlから引用
>一つのクッキーにつき4KBまで。name と OPAQUE_STRING は、
>4KBまでの形式に結合されます。.
引用終わり
全部含めて4096バイトが容量制限。
キャラクタセットによって文字数は左右されるから、自分で調べてね。
■ このスレッドは過去ログ倉庫に格納されています