トップページ⇒php
1001コメント298KB

CGIだけど、なんか質問ある? Part 6

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/07/06 13:41ID:Mpxtn4bk
CGIの運用に関する質問スレッドです。

※CGIは特定の言語に依存するものではありません。

※Perlのコーディングに関する質問は専用スレがありますのでそちらでお願いします。
  ↓
  Perl 初心者コーナー Part13
  http://pc.2ch.net/test/read.cgi/php/1022731565/l50

過去ログ・関連スレッドは >>2
0103nobodyさん02/07/14 16:41ID:T31bpVIl
>>99
なんでスラッシュがエンコードされてる時だけ
普通にファイルサーチするんでしょう??

>>101
ディレクトリと見なされないっていうのは...

/(documentroot)/hugahuga.cgi って"ディレクトリ"の
"path/to/object" を探そうとするってことですか?

%2f が入っちゃうと cgi の PATH_INFO として認識しないってことなのかな。
でも普通の QUERY_STRING 渡しとかだと別になにも問題ないですしね。

そういう仕様なんでしょうか。
http://hoohoo.ncsa.uiuc.edu/cgi/interface.html
見たけどよくわからなかった。

もし、その CGI に "slash/including/file" みたいにスラッシュを中に含んだ
名前を渡したいときってどうするべき?
といってもUNIX はスラッシュを含むファイル名って作れなかったか。
0104nobodyさん02/07/14 16:44ID:T31bpVIl
>>103

>>99 じゃなく >>100 でした。

あと、単純に PATH_INFO の内容を出力するだけのプログラムで実験したんで
CGI 中でエラー吐いてるわけじゃないです。
0105nobodyさん02/07/14 17:05ID:???
>>103
path/to/object(というディレクトリ)が存在すれば、 %2f でもPATH_INFO は取得できますね。

>もし、その CGI に "slash/including/file" みたいにスラッシュを中に含んだ
>名前を渡したいときってどうするべき?
そのまま hoge.cgi/slash/including/file では?
0106nobodyさん02/07/14 17:14ID:T31bpVIl
>>105
その場合の path/to/object ってディレクトリはどこですか?
/(documentroot)/path/to/object ですか?

あと、普通の URL の / をエンコードした場合も Not found です。
そりゃそうだ。

>そのまま hoge.cgi/slash/including/file では?
あう、そうでした。区切にスラッシュ使ってた場合、
区切りじゃないスラッシュはどうやって渡せばいいのかって話でしたけど
区切りにスラッシュ使うなってことで解決ですな。
0107nobodyさん02/07/14 17:57ID:???

PATH_INFO 解ってない馬鹿共が雁首並べているスレはここですか?
0108nobodyさん02/07/14 18:03ID:T31bpVIl
>>107
すみません。わかってません。
CGI の / 以降 ? 以前のところを PATH_INFO として
CGI に渡すってのでまちがってます?

で、なんで %2F を渡すと CGI に渡さないで Not Found になるのか
わからないんです。
0109nobodyさん02/07/14 18:04ID:???
>>106
>その場合の path/to/object ってディレクトリはどこですか?
hogehogeディレクトリ以下です(下図)
hogehoge / hoge.cgi
  |
  +----- path

>区切りにスラッシュ使うなってことで解決ですな。
まあその場合は素直に QUERY_STRING 使うってことで。
0110nobodyさん02/07/14 18:12ID:T31bpVIl
>>109
ええと、じゃあその %2f を含むパスの前の cgi プログラムの部分は無視
されるってことですか?

http://hogehoge.net/something.cgi/path%2fto%2fobject
の場合、
hogehoge / something.cgi
|
+----- path / to / object
で、
http://hogehoge.net/path/to/object と 等価????

それは違うような....??

とりあえず、 hogehoge 以下に path / to / object を配置してためしましたが
結果はおなじです。
something.cgi ってディレクトリを掘ってそこに path .. を配置しても同じでした。

サーバプログラムによるのかな。
当方 Apache/1.3.26 です。
0111nobodyさん02/07/14 18:27ID:T31bpVIl
Apache のソース見て完結しました。

PATH_INFO の中身は OS 上のファイル名として正しいかどうか検査されるらしく、
(PATH_TRANSLATED に渡すから。)
hoge.cgi/path%2fto%2fobject
とした場合、
/ 以降をきりはなしてから URL デコードが行なわれて
"path/to/object" というファイルが正しいかどうか検査されてしまうようでした。
で、スラッシュを含むファイル名は invalid なので Not Found になってしまうと。
0112nobodyさん02/07/15 01:06ID:K04tugP+
アクセス解析つけましたけどちょっと動きが変な感じがするので
テストです!どうぞ閲覧してください。アドバイスなどあれば
おねがいします。
http://s55.net/~S123/
0113nobodyさん02/07/15 09:16ID:???
新手の宣伝だな。
0114nobodyさん02/07/15 21:34ID:???
CGIの動作速度を計るにはどうしたらいいですか?
0115nobodyさん02/07/15 21:37ID:???
>>114
ストップウォッチ
0116nobodyさん02/07/15 21:39ID:???
>>115
それなし
0117nobodyさん02/07/15 21:42ID:???
>>116
ないなら買いにいけ。
0118nobodyさん02/07/15 21:44ID:???
>>117
その計り方がなし
0119nobodyさん02/07/15 21:48ID:???
>>118
これ以上正確なものってないだろ?
0120nobodyさん02/07/15 21:49ID:???
>>119
その方法はおれには無理だ
0121nobodyさん02/07/15 21:53ID:???
>>120
URLリクエスト実行と共にストップウォッチをスタートさせて、
ページが表示されましたがステータスバーに表示されると同時にストップ
、これを3回繰り返して平均値を採る。
0122nobodyさん02/07/15 21:54ID:???
>>121
もっと楽な方法が知りたいんだよ
0123nobodyさん02/07/15 21:55ID:???
>>122
地味な方法かも知れないけど、恐らくこの方法しかないから書いてんだよ。
0124nobodyさん02/07/15 21:56ID:???
>>123
そうか、ありがとう
0125nobodyさん02/07/15 22:04ID:???
なんで誰も腹時計を使わないんだ…?
0126 ◆JAPH9PWA 02/07/15 22:05ID:???
>>114
time(), time()か、そのインターフェイスであるBenchmark.pmを使いなさい。
0127 ◆JAPH9PWA 02/07/15 22:06ID:???
>>125
実際にはそれだけで済ますことが多いけどね(笑
0128nobodyさん02/07/15 22:06ID:FYJg29vU
Perl なら LWP つかってエージェント書いてみるとか。
HTTP::Monkeywrench とかも使えるかもしれない。
01299902/07/16 15:55ID:2ITiCbad
PATH_INFO なんですが、
IIS だと %2F は問題無く渡せるんですよね。
SCRIPT_NAME まではいっちゃうってのはあるけど。
なっとくいかないなぁ…
0130コギャル&中高生02/07/16 16:16ID:WKPR3v3m
http://go.iclub.to/ddiooc/

お役立ちリンク集
必ず役立ちます

コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便
↓
http://kado7.ug.to/wowo/
0131nobodyさん02/07/16 16:29ID:???
>>126
Benchmarkでできました。
ありがとうございます
0132nobodyさん02/07/16 16:53ID:???
特定のディレクトリ以下のhtmlファイルにアクセスされたら、
こちらが発行したクッキーがあるかどうか調べて、あったら、htmlファイルへのアクセスを許すというcgiが欲しいのです。
htmlファイルにアクセスされたら自動的にcgiが動いて調べて通すか通さないか決める。
こういうのってありますか?

というか、htmlファイルにアクセスされたら他のcgiが動くなんて出来るんですか?
0133nobodyさん02/07/16 17:14ID:???
.htaccess
0134 ◆JAPH9PWA 02/07/16 17:17ID:???
今更ながら、>>126は
time(), times()か、その〜
でした。ごめん。
0135nobodyさん02/07/16 17:23ID:???
>>132
できるよ。
SSIを使用して
何もないhtmlファイルにそのCGIを読み込むSSIのタグを記入。
それでもrefは取得できるから
良ければ指定のファイルを読み込んで表示。
だめならエラーを表示。
0136nobodyさん02/07/16 17:27ID:???
.htaccess でhtmlにアクセスがあったら、アクションさせればいいだろ。

Action image/html /~user/bin/ref.cgi
0137nobodyさん02/07/16 17:27ID:???
image/html ってなんだよ。
text/html
013813202/07/16 19:22ID:???
.htaccessとかSSIとか高度な事わからないので自分でやるのは無理みたいですね。
レスどうも。
まさかそんなフリースクリプト無いですよね。
0139nobodyさん02/07/16 20:45ID:???
>>138
くれくれ君でしたか。
URL に 〜.cgi ってのが出るのがいやじゃないなら
PATH_INFO を使ってやってくれるのもあるだろうね。
cgiwrapper みたいなかんじで。
でも、対象のファイルがパブリックなとこにあったら
あんまり意味ない。

シームレスにやるんだとしたら .htaccess 使えないとちょっと。
0140nobodyさん02/07/16 21:19ID:???
割算の計算で、下2桁数まで表示させたいのですが、以下のような記述をすると
エラーになってしまいます・・・。いい解決方法ないですか?

{$A = $B / $C;}
$D = sprintf("%.2f",$A);
0141nobodyさん02/07/16 21:27ID:???
A: 25 wallclock secs (25.82 usr + 0.00 sys = 25.82 CPU) @ 5809.45/s (n=150000)
                                        ↑これってなにを表してるんですか?
0142nobodyさん02/07/16 21:27ID:???
@ 5809.45/s←これ
0143 ◆JAPH9PWA 02/07/16 21:32ID:???
>>140
どんなエラーなのか分からないとなんともいえないな。
エラーメッセージが
Illegal division by zero
ってのなら、$Cに入っている値が0または数値として有効な値ではない、ってことで
キミの考えている値が$Cに入っていないということなんだけど。

014414002/07/16 22:39ID:K1PKQlrM
>>143
そのとおりでした!
無事解決です。どもです。
0145nobodyさん02/07/17 12:32ID:???
http://hoge.co.jp/aiueo.cig?hensu=aiueo

のaiueoを変数として受け取りたいのですがどうすればいいでしょうか。
0146コギャル&中高生02/07/17 12:36ID:k/AJy+eK
http://go.iclub.to/ddiooc/

お役立ちリンク集
必ず役立ちます

コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便
↓
http://kado7.ug.to/wowo/
0147nobodyさん02/07/17 12:38ID:???
$buffer = $ENV{'QUERY_STRING'};
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}

0148nobodyさん02/07/18 00:52ID:PSEaDSiM
質問です。
dbmopenを使っているPerlスクリプトを、CGIとしてApacheで動かし
たいんですが、dbmopenが動きません。.htaccessファイルの設定
がいるのでしょうか?
お分かりになる方、ご教授ください。

・dbmopenのないCGIスクリプトは問題なしです。
・別のPerlスクリプトをローカルで動かすと問題なしです。(http://www.psl.ne.jp/perl/pdojo03.htmlのスクリプト)
0149nobodyさん02/07/18 00:57ID:PSEaDSiM
>>148
不十分なので、再度。

「dbmopenを使っている別のPerlスクリプトを動かすと
問題なしです。これは非CGIスクリプトです。
(http://www.psl.ne.jp/perl/pdojo03.htmlのスクリプト)」
0150 ◆JAPH9PWA 02/07/18 00:58ID:???
(´-`).。oO(<<EOF)
"動きません"だけじゃどこに書いても同じ結果になると思うよ…。
EOF
0151nobodyさん02/07/18 01:18ID:PSEaDSiM
>>150
ですよね。(^^;
このCGIスクリプトでは、ほとんどエラーメッセージがで
ないんです。「スクリプトに use CGI qw(:standard); を付
ければ」というのを頂いたのですが、このスクリプトには
既にこれが記入されていました。

十分なエラーメッセージを出す方法がわかれば、と思うん
ですが、、
0152nobodyさん02/07/18 02:20ID:BBLbgize
>>151

use CGI::Carp qw( fatalsToBrowser );

を入れてみたら?
エラーをブラウザに表示してくれるよ。
0153nobodyさん02/07/18 02:28ID:???
http://pc3.2ch.net/test/read.cgi/tech/1017736187/281-
同じ質問に同じ解答をしてそれに対し同じような返事がきてまた同(略
本気でデジャヴかとおもたよ
◆JAPH9PWA さん〜よく頑張ってますね(はぁと
0154nobodyさん02/07/18 09:38ID:PSEaDSiM
>>151
use CGI::Carp qw( fatalsToBrowser );は既に入っていて、
そのエラーメッセージは下の1行だけです。

(dbmopen) ./diff
0155nobodyさん02/07/18 16:42ID:???
haruno.fam.cx/~sawatari/text_perlbbs.html
のページで下の文を参考にしたのですが、標準入力の値がうまく取れませんでした。

if ($ENV{'REQUEST_METHOD'} eq "post"){
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}

で、$ENV{'REQUEST_METHOD'}をprintで見たらPOSTが入っていました。
で、($ENV{'REQUEST_METHOD'} eq "POST")にしたらうまくいきました。
上の例文は間違っているんでしょうか?
0156nobodyさん02/07/18 16:45ID:???
Perlでは大文字小文字区別すること忘れてないか?
0157fusianasan02/07/18 16:46ID:???
>>155
ネタにしても、もちっとレベルの高いやつを書こうね!
0158nobodyさん02/07/18 16:46ID:yrmBF5Vl
>>155
>メソッドは当然postで。(XHTMLでは大文字は禁止)
と書いてありますが。
0159nobodyさん02/07/18 16:46ID:???
ネタだったか、釣られてしまったよ。
0160nobodyさん02/07/18 16:47ID:???
(゚д゚)ハァ?
なんでそこでXHTMLが出てくるんだ?
0161nobodyさん02/07/18 16:53ID:???
XHTML で <form method="post"... ってやっても、
UA は大文字でリクエスト出すと思うけど。

POST /~gikogiko/cgi-bin/bbs.cgi HTTP/1.1

みたいな感じで。
0162 ◆JAPH9PWA 02/07/18 16:54ID:???
>>155
request-methodの大文字小文字は環境依存な気がする。
lc($ENV{REQUEST_METHOD}) eq "post" とでもするべき。

ていうか、そのページなんか変じゃないか?

> メソッドは当然postで。(XHTMLでは大文字は禁止)

もしかして属性の値も小文字じゃなきゃいけないと思っているのだろうか…。
俺の読み間違い?謎。
その他の説明も質が悪いよ。
そんなページを参考にしてると変な癖がつくから、もっとまともなものを参考にした方がいいよ。
0163 ◆JAPH9PWA 02/07/18 16:56ID:???
レス遅すぎだね。ショボーン
0164nobodyさん02/07/18 16:56ID:???
>XHTMLでは大文字は禁止。
確かに同意だが、それは要素の話。属性値は関係ない。
そのページのpostが間違ってる。POSTと書くべき。
016515502/07/18 17:18ID:???
ネタじゃないです。
いろいろレスが付くと本当にどれが本当なのかわからなくなっちゃいます。
どうかお願いします。
$ENV{'REQUEST_METHOD'} が返す値はpostの時は、
post ですか? POST ですか?
決まっていないですか?
決まっていないとしたら>>162さんのlc(小文字に変換)のやり方をやればいいんですよね?
0166nobodyさん02/07/18 17:21ID:???
>>165
Toupper
0167nobodyさん02/07/18 17:21ID:???
>>165
/POST/i;
0168nobodyさん02/07/18 17:40ID:???
METHOD にpostなんて無い。
0169nobodyさん02/07/18 17:42ID:???
>>168
同意。
0170nobodyさん02/07/18 17:44ID:???
>>168-169
(・∀・)ジサクジエンでした。
0171nobodyさん02/07/18 17:50ID:???
>>168
同意。
0172nobodyさん02/07/18 17:52ID:???
>>168=>>172
(・∀・)ジサクジエンでした。
0173nobodyさん02/07/18 18:24ID:???
http://haruno.fam.cx/~sawatari/text_perlbbs.html?http://pc.2ch.net/test/read.cgi/php/1025930486/l20

REFERER残し晒し
0174nobodyさん02/07/18 19:17ID:???
methodにpostは無いんですか?getはあるんですか?
意味がわからないです。
0175nobodyさん02/07/18 19:50ID:???
get なんてのも無い。
GET ならある
0176nobodyさん02/07/18 22:46ID:???
つまり大文字、POSTとGETしか無いって事ですね?

if ($ENV{'REQUEST_METHOD'} eq "post"){
read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}
じゃこれは間違いなんですよね?
0177nobodyさん02/07/18 22:48ID:???
間違いです。
0178nobodyさん02/07/18 22:50ID:???
if (uc($ENV{'REQUEST_METHOD'}) eq 'POST'){
\tread(STDIN, $str, $ENV{'CONTENT_LENGTH'});
}
一件落着。
0179nobodyさん02/07/21 15:08ID:oVSm9VL9
個人情報などをCGIを使って、「登録」→「掲載」するときに
テキスト入力をする場所を80個くらい作り、
それらすべてに書き込み&送信しても不具合とかはないですよね?
不安定になるとか、負荷が過度にかかるとか。
複数の人の登録をまとめて行おうと思うのですが。
0180 02/07/21 15:32ID:???
言うことナス!
0181nobodyさん02/07/21 15:47ID:???
>>179
そら、ふざけた負荷がかかる。
って言うかインターフェース悪すぎ。
0182nobodyさん02/07/21 16:11ID:???
>>175
REQUEST_METHODの値は小文字になることもあるって聞いたけど。
だから俺は標準関数のstrcmpは使わないで大文字小文字を区別しないstrcmpを自作して使っている。
0183nobodyさん02/07/21 16:14ID:???
>>182
//i
018418202/07/21 16:14ID:???
>>183
何それ?(^_^;)
0185nobodyさん02/07/21 16:17ID:???
/get/i
018618202/07/21 16:19ID:???
>>185
REQUEST_METHODの中の文字を全てtoupperで大文字にしてからstrcmpにかけろということ?
環境変数の値は変えたくないんだけど・・・
0187nobodyさん02/07/21 16:21ID:???
お前らCGI語るならPerl位常識の範囲で知っておいてください・・・。
0188nobodyさん02/07/21 16:21ID:???
>>186
>環境変数の値は変えたくないんだけど・・・
違う変数用意すればいいじゃん。
おいおい・・・。
018918202/07/21 16:23ID:???
>>187
Perlか・・・・知らないな。

>>188
それだけのために配列を用意するのも面倒。
0190nobodyさん02/07/21 16:24ID:???
>>189
じゃあ死ぬ。
0191nobodyさん02/07/21 16:25ID:???
参照するだけなのにコピーを取る奴って・・・
0192nobodyさん02/07/21 16:26ID:???
>>191
じゃあどうやるのと。
自作strcmpなんて大げさなことするのがベストとは思わない。
0193nobodyさん02/07/21 16:29ID:???
>>192
strcmpなんて書いても7行程度だろ。しかも様々な局面で再利用できるし。
0194nobodyさん02/07/21 16:32ID:???
strcasecmp とか stricmp を知らないのか?
0195nobodyさん02/07/21 16:32ID:???
char buf[10];
int i;

strcpy(buf,getenv("REQUEST_METHOD"));
for(i=0;buf[i];buf[i]=toupper(buf[i])) ;
if(strcmp(buf,"GET")) printf("GET以外\n");
else printf("GET\n");

ここまでするの・・・
0196nobodyさん02/07/21 16:33ID:???
>>194
標準関数じゃない。
0197nobodyさん02/07/21 19:37ID:???
むしろ、stricmpもstrcasecmpも実装されていない環境を教えてほしい。
なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
環境を教えてほしい。
考えられるのはクライアントが"Get"等でアクセスしたのがそのまま通されるか、
HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
メソッドはRFC上はcase-sensitiveなので、クライアントがGetやget等で
リクエストしてもエラーを返すべき。それをしないHTTPDはタコ。
無論、メソッドを勝手に改変するHTTPDもタコ。

そんなHTTPDある?
0198nobodyさん02/07/21 20:49ID:???
>むしろ、stricmpもstrcasecmpも実装されていない環境を教えてほしい。
strチンポくらい自分で掻け
>なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
意味不明、死ね
>HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
んな訳ないだろ
>リクエストしてもエラーを返すべき。それをしないHTTPDはタコ。
shallだろ、mustじゃねー  やっぱり死ね
>無論、メソッドを勝手に改変するHTTPDもタコ。
妄想ですか?

shallの解釈位自分でやれ
実際問題、Getを飛ばしてくるアンポンタンなクライアントは
存在する、それだけ。

0199nobodyさん02/07/21 20:55ID:???
>>198
>>なおむしろ、CGIで渡される環境変数REQUEST_METHODが、小文字になる
>意味不明、死ね
CGI素人なら黙ってな。

>>HTTPDがCGIで環境変数を渡すときに勝手に改変するか。
>んな訳ないだろ
あるが?HTTPDが環境変数を設定する以上、無いという方が難しい。

夏休みって嫌い。
020019702/07/21 21:15ID:???
えと、>>196で標準関数じゃ無いとあったので、それが使わない原因なのかと
思ったんだけど、ちがうのか。っていうか、自分のプログラムでstricmpな
環境では単純にプリプロで#define strcasecmp stricmpとしている物があるの
で、それで済まない環境があるなら知りたいという意味で聞いたのだけど。

あと、HTTPDに関しても非サポートリストに加えたかったので聞いただけ
なんだけどな。
蛇足ながら、shall じゃ無くて SHOULDね。
0201nobodyさん02/07/21 21:22ID:???
夏が来た。夏が来た。
0202nobodyさん02/07/21 21:42ID:???
>>199
ほー、じゃあGetとリクエストしてGETになる様なHTTPDとやらを
挙げてもらおうかCGIのプロさんよ
■ このスレッドは過去ログ倉庫に格納されています