電子書籍の厳選無料作品が豊富!

http://oshiete1.goo.ne.jp/qa3951263.html

で質問している者です。

間違って、[回答への補足] に書いてしまいました。
もう一度質問させてください。すみません。

Location を 教えていただき、とても感謝しております。

でも、私の 001.cgi は 以下のように始まっております。

print header(-charset => 'Shift_JIS');
print start_html("001.cgi");

このprint header(-charset => 'Shift_JIS');を消して

if (param('answer') eq $ans){
print ('Location:002.cgi\n\n');
}
else{
print header(-charset => 'Shift_JIS');
##省略##
print endform;
{

としたのですが、だめでした。

if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか?

###### はじめ #####################
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI qw(-debug :standard);
print "Location:1266.cgi\n\n";
###### おわり #####################

としたら、001.cgi を開くと
002.cgi へ飛ぶことができました。

どこに
print "Location:1266.cgi\n\n";
を書けばよいのでしょうか? よろしく、お願いいたします。

A 回答 (3件)

>どこに


>print "Location:1266.cgi\n\n";
>を書けばよいのでしょうか? よろしく、お願いいたします。

print "Location:ほげほげ.cgi\n\n";
が実行出来るのは
print header(-charset => 'Shift_JIS');
を実行する前です。

念の為に書いておきますが「実行する順番」が大事であって「どこに書いてあるか」は関係ありません。前にあろうが後ろにあろうが1つあろうが複数あろうが関係なく「実行する順序だけ」が大事です。

CGIは、WEBサーバープログラムにデータを送る場合、今から送る物が何なのかを示す為、一行目にヘッダーを出力しなければなりません。ヘッダーを送ったら、1行の空行を空け、その後にデータ本体を出力します。

「送られる内容がhtml文書だった時」は、ヘッダーに
Content-type:text/html
と出力し、1行の空行を空けた後、本文を出力する決まりになっています。

「送られる内容が画像データだった時」は、ヘッダーに
Content-type:image/jpeg
とか
Content-type:image/gif
とか
Content-type: image/png
と出力し、1行の空行を空けた後、画像そのものを出力する決まりになっています。

「送られる内容がリダイレクション(転送指令)だった時」は、ヘッダーに
Location:「http://で始まるURL」
と出力し、1行の空行を出力する決まりになっています。

と言う訳で「CGIはヘッダーが命」と言うのが判ったと思います。

さて、ここで
print header(-charset => 'Shift_JIS');

Content-type:text/html
と出力し、1行の空行を空けた後、Shift_JISのフラグを付けた文字セット指示タグを出力する意味になります。

つまり、
print header(-charset => 'Shift_JIS');
を実行してしまった後では
print "Location:1266.cgi\n\n";
は実行しても意味がないのです。ヘッダー出力処理はもう実行済みですから。

簡単に言えば
print header(-charset => 'Shift_JIS');
の代わりに
print "Location:1266.cgi\n\n";
を実行すれば、1266.cgiに飛ぶ、と言う事です。
    • good
    • 0
この回答へのお礼

ヘッダーに関するお教え、本当にありがとうございました。
大変勉強になりました。

お礼日時:2008/04/18 15:16

else{


print header(-charset => 'Shift_JIS');
##省略##
print endform;
{
↑else を閉じれていません。} として下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました。うまくいきました。

お礼日時:2008/04/18 15:14

>print header(-charset => 'Shift_JIS');


>print start_html("001.cgi");
>
>このprint header(-charset => 'Shift_JIS');を消して
>
>if (param('answer') eq $ans){
>print ('Location:002.cgi\n\n');
>}
>else{
>print header(-charset => 'Shift_JIS');
>##省略##
>print endform;
>{
>
>としたのですが、だめでした。

この「##省略##」と書いている部分に「 print start_html("001.cgi");」が書かれているということでよろしいのですか?また「だめでした。」というのは次の画面に遷移しなかったということでしょうか?

>print ('Location:002.cgi\n\n');

単引用符で括ると「\n」が改行になりませんから、二重引用符で括ってください。

  print ("Location: 002.cgi\n\n");

この回答への補足

回答、まことに、ありがとうございます。

はい、
>この「##省略##」と書いている部分に
>「 print start_html("001.cgi");」が書かれて

います。

>「だめでした。」というのは
Internal Server Error
になってしまった、ということです。すみません。

print ("Location: 002.cgi\n\n");
としても Internal Server Error でした。

else の } をどこに書くのかも、関係があるでしょうか?

それから、
この質問とは関係ないかも知れませんが、私は WindowsXP に
Apache を入れて LAN の中だけで Web サーバ をやっている者です。 
よろしく、お願いいたします。

補足日時:2008/04/18 14:18
    • good
    • 0
この回答へのお礼

ありがとうございました。いろいろ、やってみたら、うまくいきました。大変勉強になりました。

お礼日時:2008/04/18 15:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!