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 あたりに
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バイトが容量制限。
キャラクタセットによって文字数は左右されるから、自分で調べてね。
0378nobodyさん
03/08/14 23:53ID:???www.foo.co.jp で発行したクッキーを、
www.bar.co.jp で取得することはできますか?
>>292 で言ってるみたいに、
www.foo.co.jp でクッキーを発行するとき、
「domain=bar.co.jp」とすれば、
www.bar.co.jp で取得できるのかなーと。
なお、今はまだ環境がととのってないので、テストで試してみることができず・・・
0380378
03/08/15 01:46ID:???あ、そうか、仕様として、そもそも発行元のドメインと取得先のドメインが違うとダメってことですか?
つまり、仕様書のdomain の項目で書いてある「後方一致」ってのは、
あくまで同じドメインでの話しってことですか?
(例だした方がわかりやすいかな・・・)
acme.comにおいて、domain=acme.comとしてクッキーを発行すると、
anvil.acme.com ではそのクッキーを取得できるけど、
hoge-acme.comでは、そのクッキーは取得できない。
・・・という理解で間違いないですか?
0383山崎 渉
03/08/15 22:33ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0384nobodyさん
03/08/16 12:45ID:KHB072f80385nobodyさん
03/08/16 15:53ID:jb3r1JoJ一般的な共有サーバで動かすことを前提にすると。
0386nobodyさん
03/08/16 22:30ID:grNQSJhAhttp://www.sexpixbox.com/pleasant/teen/index.html
0387nobodyさん
03/08/17 21:30ID:ycQ+dswyフレームを使っている性で全部リファラがindexになってしまいます。
使っている鯖はSSIは使えませんし、.htaccessも使えません。
どうすればリファラが取れるんですか?教えてください。御願いします。
すれ違いだったらすいません。
0388nobodyさん
03/08/17 23:46ID:78eH/B6l0389nobodyさん
03/08/17 23:47ID:78eH/B6l気にしなくて良し。
0390nobodyさん
03/08/17 23:57ID:???http://pc2.2ch.net/test/read.cgi/php/1060808783/171
マルポ
0391nobodyさん
03/08/20 19:32ID:M8LljIzL<input type=checkbox name="SHUMI" value="PC">パソコン
<input type=checkbox name="SHUMI" value="SP">スポーツ
<input type=checkbox name="SHUMI" value="RD">読書
のようなことができるようですが、これはいつ頃から可能になったのでしょうか?
5年ほど前は
<input type=checkbox name="SHUMI_PC" value="1">パソコン
<input type=checkbox name="SHUMI_SP" value="1">スポーツ
<input type=checkbox name="SHUMI_RD" value="1">読書
のような形でがんばっていたような記憶があるのですが
気のせいでしょうか?
0392_
03/08/20 20:02ID:???0393nobodyさん
03/08/20 20:43ID:???上手くやればできる。
今も5年前も10年前も。
0394nobodyさん
03/08/20 20:49ID:???えぇ!うまくやればってどういうことですか?
昔も前者の書き方ができたのかどうか聞きたいのですが。
ロジックの問題ではなくHTTPプロトコルレベル、または
WebブラウザとWebサーバーの対応状況の話だと思うのですが・・・
0395nobodyさん
03/08/20 20:53ID:???RFC1866あたりだよ
0397nobodyさん
03/08/20 23:22ID:???つか、今流通してるブラウザで、
<input type=checkbox name="SHUMI" value="PC">パソコン
<input type=checkbox name="SHUMI" value="SP">スポーツ
<input type=checkbox name="SHUMI" value="RD">読書
に対応してないブラウザってあるの?
平気な顔して使ってるんですが・・・
0398nobodyさん
03/08/22 00:19ID:???まさか……大丈夫だよな。
0399nobodyさん
03/08/22 00:46ID:???もう駄目だろうな。
0400nobodyさん
03/08/28 15:42ID:ER3uJlrJでは、
●クッキーを発行したあと、
●Location:ヘッダで www.hoge.com/bar.cgi にとばす
の処理をしてます。
で、質問です。
www.hoge.com/bar.cgi の中の処理で、ついさっき発行されたクッキーを読もうとしたとき、
クッキーは読み込めるのでしょうか?
環境依存なのでしょうか?
0401nobodyさん
03/08/28 17:18ID:???0402400
03/08/28 18:26ID:ER3uJlrJあ、ごめんなさい。
「クッキーに対応して、有効にしているブラウザ」の中でを条件に加えてください。
0404nobodyさん
03/08/28 22:09ID:???試したの?
0405nobodyさん
03/08/29 01:22ID:???www.hoge.com/foo.cgi
The page cannot be found
The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.
--------------------------------------------------------------------------------
Please try the following:
If you typed the page address in the Address bar, make sure that it is spelled correctly.
Open the home page, and then look for links to the information you want.
Click the Back button to try another link.
HTTP 404 - File not found
Internet Information Services
--------------------------------------------------------------------------------
Technical Information (for support personnel)
More information:
Microsoft Support
0406nobodyさん
03/08/30 08:37ID:???0407nobodyさん
03/08/31 00:28ID:???use CGI;
my $q = CGI->new;
my $file = '/hoge/hoge.jpg';
binmode(STDOUT);
$| = 1;
print $q->header(-type=>'image/jpeg');
open ( IN, $file );
binmode ( IN );
while ( <IN> ) {
print STDOUT;
}
close ( IN );
close ( STDOUT );
これで普通は動くよな?
0408nobodyさん
03/08/31 00:30ID:???0409nobodyさん
03/08/31 01:56ID:???パスは間違いない?
my $file = './hoge/hoge.jpg'; なら表示されたけど
0410nobodyさん
03/08/31 01:58ID:???こんな場所に画像ファイルを置いてるのか?
ビックリだ。
0411407
03/08/31 02:02ID:???こんなことも言い忘れるとはよほど慌てていたようです。
>>409
パスは絶対指定しています。なので、この形式でいいかと。
>>410
ああ、これはサンプルのパスです。正しいのをさらすと、ユーザー名とかがわかってしまうので。
えーと。なんでだめなんだろう。
■ このスレッドは過去ログ倉庫に格納されています