• ベストアンサー

次のcgiファイルを開くには? もう一度

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"; を書けばよいのでしょうか? よろしく、お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

>どこに >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に飛ぶ、と言う事です。

ttaa100kkaa
質問者

お礼

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

その他の回答 (2)

回答No.3

else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { ↑else を閉じれていません。} として下さい。

ttaa100kkaa
質問者

お礼

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

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>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");

ttaa100kkaa
質問者

お礼

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

ttaa100kkaa
質問者

補足

回答、まことに、ありがとうございます。 はい、 >この「##省略##」と書いている部分に >「 print start_html("001.cgi");」が書かれて います。 >「だめでした。」というのは Internal Server Error になってしまった、ということです。すみません。 print ("Location: 002.cgi\n\n"); としても Internal Server Error でした。 else の } をどこに書くのかも、関係があるでしょうか? それから、 この質問とは関係ないかも知れませんが、私は WindowsXP に Apache を入れて LAN の中だけで Web サーバ をやっている者です。  よろしく、お願いいたします。