• ベストアンサー
  • すぐに回答を!

Cookieがクリアされない

入力フォームを作っています。 トップのフォームにクッキーをセットして、確認画面→登録完了フォームでクッキーをクリアにしています。 クッキーの登録は全て良いんですが、Cookieは、IEではちゃんとクリアされるんですが、Netscape,Firefoxではクリアされません。 色々試したんですが、お手上げ状態です。 ご教授お願いします。 print "Content-type: text/html\; charset=shift_jis\n"; $CookieSet .= "Set-Cookie: $CookieName=$CookieValue\; expires=$GmtString\;"; print "\n"; print "Content-type: text/html\; charset=shift_jis\n"; $ClearCookie .="Set-Cookie: $CookieName=clear\; expires=$ExpiresTimeString\;";#過去の日付'Thu, 01-Jan-2000 00:00:00 GMT' print "\n";

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数298
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.3
  • hrm_mmm
  • ベストアンサー率63% (292/459)

>print " $CookieClearString\n"; # 先頭のブランクがよけいかもしれないけど、ここが問題じゃない気もする これ以外の記述は合っていそうですけど、ブラウザで違うって云うのが不可解ですね。 サーバーの時計が狂っていて期限判定が違っているとか?以下参照。 http://blog.goo.ne.jp/hiuchida/e/1da4b676a699206c7e26e7b5edee1443 でも、年単位で違うってことも無いと思うけど?? 消す時も、&SetCookieを利用して、$ExpireDate = '20000101000000';にして実行してみるとどうなりますか? もしかして「どの時点で削除されてないと判断したか」が問題なのかも? A. cookie 登録 このページ表示の時はcookieはまだ取得出来ない B.次ページ(またはリロード) cookie取得ok C. cookie 削除ヘッダー送信 このページ表示の時はcookieはヘッダー送信前に取得されている ブラウザのクッキー情報欄でも次ページにいくまで残っていることもあり得る。そこまで規定されてはいないらしいので。 D.次ページ(またはリロード) cookie削除ok 時々Cの時点で早合点する人がいます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 ご親切に回答頂き感謝しております。 お陰様で解決することが出来ました。 思えば単純な事でした;; Mozilla系は?もしやと思い、 print "Content-type: text/html\; charset=Shift_JIS\n\n"; の「charset=Shift_JIS」を取ってみたらビンゴ!成功しました。 しかし、Setの場合はcharsetが入ってても登録はOKで削除の場合はNGなんて 理解できません・・・。 今度からは、charsetはmetaだけで記述したほうが良さそうですね。 ブラウザはieで統一されればCSSにしてもjavaにしても楽なんですがね。。 この度は、みなさんありがとうございました。

その他の回答 (3)

  • 回答No.4

> ブラウザはieで統一されればCSSにしてもjavaにしても楽なんですがね。。 いやいやいや、それは自分の都合だと批判を受けるので注意したほうがいいです(苦笑) IEを使わない人がいるのはIEが嫌いだからなわけだし、IEに統一しろと言っても非Windows環境にはIEが提供されていないわけだし。 それにもし仕様が統一されるならば国際的に定められた規格どおりになるのが望ましく、IEの仕様に統一されるべきではありません。 ついでに言うとIEはCSSやら何やらのいい加減な記述を許容するため、IEに通用するCSSの記述は国際規格に準拠していないものも多いですよ。 考えるのは自由何だけど迂闊に発言して批判受けるのだけは避けないと痛い目に遭うかもしれません。 まぁ、こっちの知るところじゃないしあなたがどうなっても構わないわけなんだけどね、ただ気になったわけでね。

共感・感謝の気持ちを伝えよう!

  • 回答No.2
  • hrm_mmm
  • ベストアンサー率63% (292/459)

$ClearCookie を出力していないように見えるのだけど、一行抜けてますか? あと、$GmtStringや$ExpiresTimeStringの形式はどうなっているのかとか \n改行コードが最後にもう一個足りないとか。 チェック項目はいろいろありそうです。 特に時刻表記が正しくないと、時刻設定しない時と同じ=ブラウザ終了までの期限 となりますので、登録時はうまくいってるように見えても削除の時は出来ないでしょう。 ieは結構勝手に解釈してくれるので、ieで確認していると正しい表記を覚えられません。 perl5.5では以下で動作していましたよ。 sub setCookie{ my ($cname,$cvalue,$days) = @_; my $jikoku = time + $days *24*60*60; my $kigen = gmtime($jikoku); //スカラーコンテキストでは "Sat Jul 21 12:21:21 2007" などの表記が得られる。 return qq(Set-Cookie: $cname=$cvalue\; expires=$kigen\; \n) ; } print &setCookie("cookiename","",-1); print "Content-type: text/html\; charset=Shift_JIS\n\n";

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 Perlのバージョンは5.8.5です。 サーバーはApache2系です。 ご指摘の箇所は、全てチェックしてるんですがどうしてもなりません。 futomi's CGI Cafe様のサイトにサブルーチン集の中にあるCookieのルーチンを 試したんですが駄目でした。 日付を指定なければセッションが終了した時点で、クリアされますしまた先に述べたように上書きで処理は出来るんですが、クリアされないのがどうしても気がかりで・・・。 当然私のスキルの問題もありますので、是非、ご教授願いたいと思いまして。 SetCookieの日付は2038年を設定してサーバー側が対処出来ないかもしれないので2010年にしております。 CookieClearの過去の日付はfutomi's様のルーチンをそのままに設定しています。#'Thu, 01-Jan-1970 00:00:00 GMT' テスト用に今回のルーチンは(futomi's CGI Cafe様のサブルーチン集のCookieです。) 【SetCookie】 $CookieName ="Key"; $Key = "012345"; $ExpireDate = '201001010000'; $CookieHeaderString = &SetCookie($CookieName, $Key, ExpireDate); print "$CookieHeaderString\n"; print "Content-type: text/html\; charset=Shift_JIS\n"; print "\n"; 【CookieClear】 $CookieName = "Key"; $CookieClearString = &ClearCookie($CookieName); print " $CookieClearString\n"; print "Content-type: text/html\; charset=Shift_JIS\n"; print "\n"; 日付あたりに問題があるのでしょうか? それともどこか記載に誤りがあるのでしょうか?

  • 回答No.1
  • W_H
  • ベストアンサー率47% (21/44)

なぜクリアされないか分かりませんが、ぼくの場合はデータを空白で上書きしています。 ですので、一度Cookieを削除する処理は、上と全く同じにして、値だけ空白にしてみてはどうでしょう? Cookieはデータの一時保存というのが目的ですから、データさえ読み込めなくなれば、目的は達成かと思われます。 ぼくも悪戦苦闘した時期に、Cookieが消えなくて、今の方法にしました。何で設定時間を過去にしたのに、削除できないんでしょうね。(苦笑) あと、どうしても削除にこだわるなら、時間を上のように固定するのではなく、現在時間(および、数秒前)に設定してみてはどうでしょうか。ちょっと処理は多くなりますが、試してみてください。何か変わるかもしれません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 おっしゃるように、今現在、別のCookieを読ませて上書きしてるんですがどうしても削除がならないのが気になりまして・・・。 色んなサイトを見たのですが、他のサイトではクリアされてるんです。 何故、私のだけならないのかその理由を知りたくて質問させて頂きました。 ご親切に有り難う御座います。

関連するQ&A

  • Cookieが保存できない。

    CGIをつかってクッキーを保存しようと試みています。 以下のように記述しておりますがなぜかクッキーファイルが生成されません。 print "Content-type: text/html\n"; print "Set-Cookie: NAME=test\n"; print "\n"; print "テスト"; 何か問題がるのでしょうか?もちろんブラウザ上ではクッキーは有効にしていますし、ほかの他クッキーファイルは存在します。 ブラウザはIE6.0です どなたかご教授お願いします。

    • ベストアンサー
    • CGI
  • Cookieを用いてのセッション管理

    以前も問い合わせさせていただいた件なのですが、 未だ解決していないので、再掲させていただきます。 やりたいことは、 個人認証のページを作り、ログオフ後、ブラウザの戻るボタンを押しても、 ログイン中となるのを避けたい。 以下のような感じで、cookieを使って実現しようとしているのですが、 ログオフ時にcookieの削除は、うまくいったのですが、 ブラウザの戻るボタンでログイン中のページに戻ると、 $ENV{'HTTP_COOKIE'}の中身を見ると、実際にはCookieは削除されているにも関わらず、 Cookieの情報がよみこまれているため、ログイン中となってしまいます。 何か基本的なやり方を間違っているような気がします。 どなたかご教授願います。 ↓a1.cgi(ログイン画面)--------------  : (ID、パスワード認証後) #Cookie書き込み print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Tue, 1-Jan-2030 00:00:00 GMT;\n"; print "\n";  : ↑a1.cgi(ログイン画面)-------------- ↓a2.cgi(ログイン中)--------------  : #Cookie読み込み $cookie01 = "$ENV{'HTTP_COOKIE'}\n";  : <HEAD> <!-- キャッシュクリア --> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">  : </HEAD>  : ↑a2.cgi(ログイン中)-------------- ↓a3.cgi(ログオフ)--------------  : #cookie削除。 print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Fri, 31-Dec-1999 23:59:59 GMT;\n"; print "\n";  : </HEAD>  : ↑a3.cgi(ログオフ)-------------- ※a1.cgi、a2.cgi、a3.cgiは同じディレクトリです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • どうしてもCookieとCGI・perlの関係?が理解できない。

    ととろさんのところを(http://tohoho.wakusei.ne.jp/www.htm)みながら、なんとかPerl・CGIを勉強しているところです。 普通にフォームに入力されたものをログファイルにとる、などはできるようになったのですが、 どうしてもクッキーのところでつまづいてしまいます。 Cookie書き込みの例、のところに、 Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59; とやったら、tanakaというクッキーが作成されるのでしょうか? どうしてもこの辺がわからないのです。 これを実行する場合、 #!/usr/local/bin/perl print "Content-type:text/html\n"; print "Set-Cookie: NAME=tanaka; Fri, 31-Dec-2030 23:59:59;" print "\n"; のようにやるのですか? 最終的にはフォームの入力値を取得・反映したいと考えているのですが…。 あちこちわかりやすいと言われるcgi・PERL解説サイトをみたのですが、どうしてもここだけが理解できませんでした。

    • ベストアンサー
    • CGI
  • cookieについて教えてください。

    iswebのサーバーを借りています。 cookieの書きこみを下のような記述を試しています。 ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time + 60*60*3); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut'); $date = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",$week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec); $mydata = "abc"; print "Set-Cookie: AAA=$mydata; expires=$date;"; print "Content-type: text/html\n"; print "\n"; print "<meta http-equiv="Set-Cookie" content="AAA=$mydata; expires=$date">"; 以下いろいろつづく。 この時にSet-Cookie: AAA=$mydata; expires=$date;";を残すとエラーが出てmetaを残すと動きます。 自分のパソコンの中では、両方動きます。 そこで教えていただきたいのですが、 javascriptのdocument.cookie、perlのSet-Cookie、metaのSet-Cookieの違いを教えてください。

    • ベストアンサー
    • Perl
  • "Content-type:text/html;charset=shift_JIS\n\n" がテキスト表示されてしまう。

    CGIで print "Content-type:text/html;charset=shift_JIS\n\n"; を出力すると その文字列がそのままブラウザにテキスト表示され、その後ろの操作、 例えば、 print "Status: 301 Move Permanent\n"; print "Location: http://localhost/file/data-1.lzh\n\n"; も、単純に文字列として表示されてしまいます。 ところが、print "Content-type:text/html;charset=shift_JIS\n\n"; の行を削除すると、 もともとの目的の動作(上記の例ではファイルのダウンロード画面ポップアップ)になります。 このように、print "Content-type:text/html;charset=shift_JIS\n\n";を書かなくて済む (あるいは書かない方が良い場合)というのは、なぜでしょうか。 サーバによっては動作が変わるのでしょうか。 ※そのCGI内で、print "Content-type:text/html;charset=shift_JIS\n\n"; を2行書いてあるというようなことはありません。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • perlでHTML出力時の文字コード

    Perlスクリプト中でHTML出力しているのですが、print "Content-type: text/html\n\n";と記述するとEUCで正常に表示され、print "Content-type: text/html; charset=Shift_JIS\n\n";と明示的にSJISを指定すると空白ページが表示されてしまいます。このスクリプトの他の場所ではprint "Content-type: text/html; charset=Shift_JIS\n\n";で正常にSJISで表示されます。どうしてだかわかりません。どなたかご教授お願いします。

  • クッキー書き込みが正常に行われない?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=394703 を質問していたものです。 1.フォームで名前を入力 2.1の情報をクッキーに書き込み ということをやりたいのです。 (応用いたしますが、基本はこれです。) 1つ目のcgiで、フォームで名前を入力。 -----1.cgi-------------------- #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print "<form method=post action=2.cgi>\n"; print "<input type=text name=name></input><BR>\n"; print "<input type=submit value=ok></input><BR>\n"; print "</form>\n"; exit; ------------------------------ 1.cgiの名前のデータを呼び込もうとしてもエラーになる。 -----2.cgi-------------------- #!/usr/local/bin/perl read(STDIN,$atai,$ENV{'content_length'}); ($key, $value) = split(/=/, $atai); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print &setCookie("name",$value); print "Content-type:text/html\n\n"; print "名前:<FONT COLOR=RED>",$value,"</FONT>と送信されました。<br>\n"; #Cookie書き込み。 sub setCookie{ local($tmp,$val); $val = $_[1]; $val =~ s/(\W)/sprintg("%%%02X",unpack("C",$1))/eg; $tmp="Set-Cookie: "; $tmp .="$_[0]=$val; "; $tmp .="expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; return($tmp); } ------------------------------ クッキー書き込みをしないで実行すると、きちんと名前が表示されます。 どこをなおせばきちんとクッキーにセットされるのでしょうか? 何度も申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • CGI
  • クッキーの基礎的なことについて

    print "Content-type: text/html\n\n"; #クッキーがないときの動作。 #クッキーがない場合クッキーを期限1日で発行する。 if(!$ENV{'HTTP_COOKIE'}){ #クッキーが存在する場合の動作 print "クッキーないない<br>\n"; #1時間先のグリニッジ標準時を取得し、weeksとmonthsを定義 ($gmSec, $gmMin, $gmHour, $gmMDay, $gmMon, $gmYear, $gmWDay, $gmYDay, $gmIsDst) = gmtime(time + (3600 * 24)); $gmYear += 1900; @weeks = ('Sun', 'Mon', 'Tue', 'Web', 'Thu', 'Fri', 'Sat'); @months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); #クッキーの有効期限をその日の1日後までにする $limitTime = sprintf("%s\n, %02d-%s-%04d %02d:%02d:%02d GMT",$weeks[$gmWDay], $gmMDay, $months[$gmMon], $gmYear, $gmHour, $gmMin, $gmSec); #クッキー発行 print "Set-Cookie: myBool=1; expires=$limitTime\n"; print "\n"; } else { #クッキーがあった場合の動作。クッキーありと表示するだけ。 print "クッキーあり。"; } クッキーの発行を見ると print "Set-Cookie: なんたらかんたら"; らしいのですが、printでこう書くだけでクッキーが発行できたことになるのですか? 実行しても、ただ単に例えば Set-Cookie: myBool=1; expires=Mon , 08-Aug-2005 12:11:43 GMT というようになるだけです。 初心者でまだ1度もクッキー作成成功してないのですが何がいけないのでしょうか。

    • ベストアンサー
    • Perl
  • クッキーのタイミング

    PHPのクッキーは、ブラウザにContent-type:のようなものが届く前にクッキー命令が届く必要がありましたが、Perlではそういった決まりはないのですか? <body> が出力される前に print "Set-Cookie: ~"; すると、bodyのbgcolorがむこうになったりしますよね? print "Set-Cookie: ~";によってbodyが出力済みと解釈されるためだと思います。 できればPHPのように <HTML>を出力する以前に print "Set-Cookie: ~"; したいのですが、よい方法はありませんか?

  • EUCで保存されたスクリプトにてShift_jisでのHTML出力

    perl見よう見まねで改造ができるレベルの者です。 表題の件ですが、ある登録スクリプトをEUCで保存し、登録データファイルもEUCで保存を行っているのですが、携帯からも対応させる為に、携帯用ページではShift_jisで表示を行いたいと思っています。 $word = "ああああ"; &jcode'euc2sjis(*word); 上記のようなコードで、EUCで保存されたスクリプト内の文字がShift-JISに変換されるというのを見つけたのですが、これがprint文の場合どうすれば良いのかわかりません。 例えば、 print "Content-type: text/html;charset=shift_jis\n\n"; print <<_HTML_; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <form method="POST" action="CGIファイル"> 登録項目1<br> <input type="text" name="touroku1" value="$in{'touroku1'}"><br> 登録項目2<br> <input type="text" name="touroku2" value="$in{'touroku2'}"> </form> </body></html> _HTML_ 上記のようなHTMLをShift_jisで表示する場合、どのようにすればよいのでしょうか? use encoding 'euc-jp', STDOUT=>'shift_jis' while(<>){ print $_; } 上記のようなコードも調べたのですが、今一適用方法が解らない状況です。 また、携帯用ページではShift_jisで表示を行いたいのと同時に、登録データファイルにはEUCで保存されるようにする方法もご教授頂けますと幸いです。 宜しくお願い申し上げます。

    • ベストアンサー
    • Perl