認証OKの際に、ある別のホームページのURLへ飛ばしたいのですが、下記の部分をどう書き換えて
リンクさせればよいのでしょうか?
いまはそれぞれOKの場合とNGの場合のhtmlファイルを表示するソースになっています。
#!/usr/bin/perl
use strict;
require "cgi-lib.pl";
my %passwords = ('hoge','hoge',);
my $ok = "hoge.html";# パスワードが一致した場合の表示ファイル
my $ng = "error.html";# パスワードが違った場合の表示ファイル
.
.
.
ご指南宜しくお願いします。
こんにちは。
どこを聞きたいのか分からないのでとりあえず、方法だけ。
●[ID・PASSが正しいかチェックする]
サンプル(パスワードをチェック)
if($id eq "pass" && $pass eq "pass"){#正しい場合の処理}
else{#PASSを誤った場合の処理}
[参考]
http://www.iis.u-tokyo.ac.jp/~susaki/perl/condition.html
●[POST・GETからデータを受け取る]
sub post_data{
my $buffer;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
my @pairs = split(/&/,$buffer);
my $pair;
my %form;
foreach $pair(@pairs){
my ($name, $value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$name} = $value;
}
return \%form;
}
[参考]
http://chain.main.jp/perl/cgi.html
●[リダイレクトの方法]
my $url="http://sample.com"; #ファイルが置いてあるURLを書く
#サンプル(OKのHTMLに飛ぶ)
print "Location: $url$ok\n\n";
[参考]
一人当たり1回までしか回答できず、また、コメントもつけられないという設定になっているので、続けての回答をしたくても出来ずに困っておられるかもしれません。
失礼ながら、横槍を入れさせていただきますが、、、、
質問者様のコードを見る限り『URLに飛ばす』ではなく『URL先からファイルを取得して表示する』になっていますが、どちらをお望みですか?
『URLに飛ばす』のであれば、
if($pass eq $value){
$files = $ok;
next;
}
の中を、1/で回答いただいている
if($pass eq $value){
my $url="http://sample.com"; #ファイルが置いてあるURLを書く
print "Location: $url$ok\n\n";
exit;
}
に変更すればよろしいでしょうけど、、、
『ファイルを取得して表示する』のであれば、
socketを使うために長ったらしいコードが必要になります。
http://ash.jp/perl/socket_http.htm
↑上記ページのhttp.plのソースが比較的わかりやすいと思いますので、見ていただきたいのですが、phpと違ってPerlでのURL取り込みは非常に面倒ですし、セキュリティや倫理的な穴を開ける可能性のあるものなのでプロバイダによってはソケットを実装していない場合もあるので注意が必要です。
改造するとすれば、ソケットを組み込む位置は上記の『URLに飛ばす』と同じ場所で良いでしょう。
ご丁寧な回答いただきまして有難うございます。
アドバイスいただいた内容を参考に試してみたいと思います。非常に参考になりました。
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | kazuokohchi | 3回 | 1回 | 0回 | 2006-12-23 22:01:47 |
有難うございます!
おそらく「リダイレクトの方法」の部分のことだと思います。
アドバイスを参考に、下記のように書き換えたのですが、パスワードを間違えても全部my $ok = "hoge.html"へ繋がってしましいました。。
パスワードを間違えた時には、my $ng = "error.html";に飛ばすには何か足りないのでしょうか?
#!/usr/bin/perl
use strict;
require "cgi-lib.pl";
my %passwords = ('hoge','hoge',);#
my $url="http://sample.com"; #各ファイルが置いてあるURL
my $ok = "hoge.html"; #パスワードがOK場合の表示ファイル
print "Location: $url$ok\n\n";
my $ng = "error.html";# パスワードが違った場合の表示ファイル
print "Location: $url$ng\n\n";
その後のソース
my %input;
&ReadParse(\%input);
my $id = $input{'id'};
my $pass = $input{'pass'};
my $files = "";
my @key = keys %passwords;
my $idcount = 0;
foreach my $i(@key){
if($i eq $id){
$idcount++;
my $value = $passwords{$i};
if($pass eq $value){
$files = $ok;
next;
}
}
}
my $ermsg;
unless($files){
$files = $ng;
unless($id){
$ermsg = "ユーザーIDを入力してください。";
}
elsif($pass eq ""){
$ermsg = "パスワードを入力してください。";
}
elsif(($id)&&($idcount eq 0)){
$ermsg = "IDが一致していません。";
}
else{
$ermsg = "パスワードが一致していません。";
}
}
my $str = "";
if(open(FP,"<$files")){
&file_lock(*FP);
while(<FP>){$str .= $_};
flock(FP,8);
close(FP);
}
$str =~ s//$ermsg/;
print<<"END";
Content-type: text/html
$str
END