CGI-BBS > 基本認証 > 仕組み > cgiファイルを起動してhtmlファイルを開きたいのですが


カレッヂ
カレッヂ


質問者 rannko  投稿日 3/31(日) 01:07:42
index.htmlを経由してからじゃないと、次のページが開かないようにしたいのですが、うまくいきません。(index.htmlからopen.cgiを起動させprivate failの中のa.htmlを開きたい)
一応、「CGIでパスワード制限」を参考にして次のような構成にしています。
何方かアドバイスして頂けないでしょうか。


# |-index.html
# |
# |-cgi-bin
# | |-- open.cgi
# |
# |-private
# | |-- a.html
# | |-- b.html
# | |-- c.html
# | |-- d.html



index.htmlの内容

<html>
<head>
<title>open file</title></head>
<form action="open.cgi" method=post>
<select name="target">
<option value="a.html">ページA
<option value="b.html">ページB
<option value="c.html">ページC
<option value="d.html">ページD
</select>
<input type=submit>
</form>
<p>
</body>
</html>


open.cgiの内容

#!/usr/local/bin/perl

$private = '../../private';

$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}

$target = $FORM{'target'};

print "Content-type: text/html\n\n";

open(HTML,"$private\/$target");
回答者 まさ  [削除]  投稿日 3/31(日) 09:41:53
<form action="open.cgi" method=post>
とこういう風にしているのなら、

$buffer = $ENV{'QUERY_STRING'};
ではなく、
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
でしょう。

あるいは
method=GET
に変えるとか。

それにこのスクリプトは
open(HTML,"$private\/$target");
で終わってるのでしょうか?

printしなくていいのですか?

質問者 rannko  [削除]  投稿日 3/31(日) 23:55:12
レスありがとうございます。

<form action="open.cgi" method=post>を
<form action="open.cgi" method=GET>に修正します。

それと、
open(HTML,"$private\/$target");
以降なのですが、正直どうしていいのかわかりません。
教えて頂けないでしょうか。
回答者 まさ  [削除]  投稿日 4/1(月) 10:18:02
open以降はいろいろとやり方があると思いますが、こんなのはどうでしょう。

open(HTML,"$private\/$target");
@html = <HTML>;
close(HTML);
print @html;

これでダメですか?

質問者 rannko  [削除]  投稿日 4/1(月) 14:12:56
おかげさまで解決致しました。
たいへんありがとうございました。

このページは終了したので返信(回答)は書きこめません

Web裏技