記事No | : 7841 |
投稿日 | : 2010/08/23(Mon) 15:36:48 |
タイトル | : print "Set-Cookie:について |
ID情報 | : taitan9 |
投稿者 | : 昼行灯 |
URL | : http://taitan.net |
いつもお世話になっております。
止めときゃ〜いいのに又ハマッテしまってます。
ワンランク上のperl・・・著書よりDataCabinetを勉強しております。
名前とメールアドレスをクッキー保存しょうと思い立ち(必要ない!と言われそう)同本のCHAPTER2・bbsのregst.cgiからクッキー発行サブルーチンを、mtbbs.cgiからクッキー取得のサブルーチンを切り取りcabinet.cgiの最後尾に貼り付けました。
cabinet.cgiの495行付近のprint <<"EOM";の前行に&set_cookie('$name','$mail');と書きクッキー発行サブルーチンをコールしていますがSet-Cookie: MTBBS=$cook; expires=$gmtの文字が画面に表示されてしまいます。
print "Content-type: text/html\n\n";を付加したり色々やってみましたが上手くいきません。
ビギナーが・・・と言われそうですがperl向学のためご教示いただければ嬉しいです。
環境はWinXP,SP3です。
よろしくお願いいたします。
記事No | : 7845 |
投稿日 | : 2010/08/23(Mon) 16:19:54 |
タイトル | : Re: print "Set-Cookie:について |
ID情報 | : liberty8 |
投稿者 | : KK |
URL | : http://www11.atpages.jp/atgamewikibbs/Patio.html |
HTTPレスポンスの構造
http://itpro.nikkeibp.co.jp/article/COLUMN/20060215/229453/?SS=imgview&FD=-1839915280&ST=selfup
ヘッダとボディの区切りに空行が使われます。
その空行後の出力は全てボディとして扱われます。
一度空行を出力すると、その後ヘッダは出力できません。
あと、「'」は展開なし文字列リテラルといいます。
これは、囲った文字列内で変数を展開しないリテラルです。
「\'」以外のエスケープ処理は無視され、例えば、
my $var = '\$';
とすると$varにはそのまま「\$」が格納されます。
変数を展開するには「"」(展開あり文字列リテラル)を使いますが、単に
print "$var";
と使ってしまうと、
print $var;
の倍メモリを喰ってしまいます。
あと、なるべくスクリプトの上の方に
use strict;
use warnings;
と書くようにしてください。
この記述の説明に関しては長くなるのでご自分で調べてください。
ここでは簡単にしか説明しませんが、疑問になったことはすぐ調べてください。
記事No | : 7853 |
投稿日 | : 2010/08/24(Tue) 09:12:42 |
タイトル | : Re^2: print "Set-Cookie:について |
ID情報 | : taitan9 |
投稿者 | : 昼行灯 |
KKさま
ありがとうございます。良い勉強になります。
> ヘッダとボディの区切りに空行が使われます。
> その空行後の出力は全てボディとして扱われます。
>
> 一度空行を出力すると、その後ヘッダは出力できません。
print "Set-Cookie: 〜\n";はボディと扱われて文字列表示されたのですね。
それでは、クッキー発行サブルーチン(sub set_cookie)中に
print "Set-Cookie: MTBBS=$cook; expires=$gmt\n";
とあります。
これをヘッダとして取り扱う(呼び出す)には具体的にどうすればよろしいのでしょうか?
bbs/regist.cgiには
# クッキー保存
if ($in{'cookie'} == 1) {
&set_cookie($in{'name'}, $in{'email'}, $in{'cookie'});
} else {
&set_cookie('', '', '');
}
# 完了メッセージ
&header("スレッド作成");
と記述しておりましたが?
ご多忙中とは思いますが宜しくお願いします。
記事No | : 7855 |
投稿日 | : 2010/08/24(Tue) 09:54:05 |
タイトル | : Re^3: print "Set-Cookie:について |
ID情報 | : liberty8 |
投稿者 | : KK |
URL | : http://www11.atpages.jp/atgamewikibbs/Patio.html |
空行を出力する前に何か出力すれば、それはヘッダとなります。
MT-BOARDのソースコードは見たことがないのでどういう処理を行っているのかわかりませんが・・・。
headerサブルーチンで空行が出力されるなら、
headerサブルーチンの呼び出しよりも前にSet-Cookieフィールド(ヘッダ)を出力すれば良いです。
以下のウェブページが参考になります。
http://www.studyinghttp.net/header
http://www.studyinghttp.net/cookies
記事No | : 7858 |
投稿日 | : 2010/08/24(Tue) 11:56:30 |
タイトル | : Re^4: print "Set-Cookie:について |
ID情報 | : taitan9 |
投稿者 | : 昼行灯 |
KKさん
> 以下のウェブページが参考になります。
> http://www.studyinghttp.net/header
> http://www.studyinghttp.net/cookies
読ませていただきました。
理解困難な所がありますが、要は猿真似ではダメ!
カラクリを理解して使えってことですね。
何度も読み返して少しづつ理解できるようになりました。
ご指導ありがとうございます。