• ベストアンサー

クッキー発行がFirefoxだとできるのにIEだとできない

たびたびすみません。以下ソース。 #現在時から何秒足すか、又は引くか。 $AddOrDeduct = 3600 * 24; print "Content-type: text/html\n"; #クッキーがないときの動作。 #クッキーがない場合クッキーを期限1日で発行する。 if(!$ENV{'HTTP_COOKIE'}){ #クッキーが存在する場合の動作 #1日先のグリニッジ標準時を取得し、weeksとmonthsを定義 ($gmSec, $gmMin, $gmHour, $gmMDay, $gmMon, $gmYear, $gmWDay, $gmYDay, $gmIsDst) = gmtime(time + $AddOrDeduct); $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"; print "クッキーないない($limitTime)\n"; } else { #クッキーがあった場合の動作。クッキーありと表示するだけ。 print "\n"; print "クッキーあり。"; } 問題はタイトルのように、Firefoxだとちゃんと2度目以降は「クッキーあり。」と表示されるのですが、IEだとずっと「クッキーないない(ry」のままなんです。 まだクッキーに関しての知識があまりないので解決法が分からなく、質問させてもらいました。 よろしくおねがいします。

  • ggaogg
  • お礼率86% (209/243)
  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

未確認ですが、$limitTime 内の中途半端なところに \n が入っているのが原因ではないでしょうか? $limitTime = sprintf("%s\n, %02d- ・・・               ^^^ 本来こんなところに改行があってはいけないので、これを抜いてみてください。

ggaogg
質問者

お礼

ぐふあああああありがとうございますう。 "\,"とするのを"\n,"としていました。。 ありがとうございます。 自分の腕に自信が持てるものだとミスを気にするのですが、そうでないものは考えそのものの間違えをきにしてしまいます。。 なさけない質問ですみませんでした。 しかし助かりました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

http://okweb.jp/kotaeru.php3?q=1565761 の#1で指摘されていることが原因じゃないでしょうか

ggaogg
質問者

お礼

きちんとクッキー発行は最初にしています。 http://okweb.jp/kotaeru.php3?q=1565761 の質問のときには、Firefoxですらクッキー発行ができなかったのが、Firefoxではできるようになりました。 また起こる動作も全く別です。 もし同じ原因だとしても、自分では解決する知識と自信がないので、どのあたりがおかしいのかのご指摘もらえるとうれしいです。

関連するQ&A

  • クッキーの基礎的なことについて

    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
  • クッキーについて

    以下はperlにcookieが含まれている例です。(長くてすみません)結局、フォームに書き込んだ項目がクッキーによってすぐ表示されるということです。この場合、別のファイルで項目を取得するにはどうすればよいでしょうか。 #! c:/perl/bin/perl require "jcode.pl"; #============================ ユーザー設定 ==== $CHARSET = 'Shift_JIS'; # 文字コード $DATAFILE = './board.dat'; # 記事ファイル 中略 $COOKIE_PREFIX = 'simplebbs'; # クッキープリフィクス $COOKIE_LIFE = 10; # クッキー期限(日) #======================== メインプログラム ==== loadFormdata(); loadCookie(); # 記事データの読み込み open(FILE, "<$DATAFILE") or printErrorPage("記事ファイルが開けません。"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close(FILE); if(exists $FORM{'mode'}) { if($FORM{'mode'} eq 'write') { writeArticle(); # 書き込みモード } 中略 # 削除モード } # 記事データの書き込み 中略 printPage(); exit; #========================== 記事ページ出力 ==== sub printPage { my $begin = $FORM{'page'} * $PAGEVIEW; my $end = $begin + $PAGEVIEW; if($end > @DATA) { $end = @DATA; } printHttpHeader(); print <<END; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>けいじばん</title></head> <body> <h1>掲示板</h1> <form action="$ENV{'SCRIPT_NAME'}" method="POST"> 名前:<input type="text" name="author" size="40" value="$COOKIE{'author'}"><br> 電子メール:<input type="text" name="email" size="40" value="$COOKIE{'email'}"><br> 題名:<input type="text" name="title" size="60"><br> 内容:<textarea cols="60" rows="5" name="text"></textarea><br> <input type="hidden" name="mode" value="write"> <input type="submit" value="書き込み"> <input type="reset" value="リセット"> </form> <hr> <form action="$ENV{'SCRIPT_NAME'}" method="POST"> END # 記事の出力 my ($i, $nextpage, $nextlink); for($i = $begin ; $i < $end ; ++$i) { 中略 } # 次ページへのリンク 中略 #========================== 記事を書き込む ==== sub writeArticle { my @wdy_str = ('日', '月', '火', '水', '木', '金', '土'); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time); my $date = sprintf("%4d年%02d月%02d日(%s) %02d:%02d", $year + 1900, ++$mon, $mday, $wdy_str[$wday], $hour, $min); unshift @DATA, 中略 $COOKIE{'author'} = $FORM{'author'}; $COOKIE{'email'} = $FORM{'email'}; } #========================== 記事を削除する ==== 中略 #======================== HTTPヘッダー出力 ==== sub printHttpHeader { # グリニッジ標準時の文字列 my @mon_str = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); my @wdy_str = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + ($COOKIE_LIFE * 24 * 60 * 60)); my $date = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $wdy_str[$wday], $mday, $mon_str[$mon], $year + 1900, $hour, $min, $sec); # ヘッダーの出力 my ($name, $value); print "Content-type: text/html; charset=$CHARSET\n"; foreach $name (keys %COOKIE) { $value = $COOKIE{$name}; $name = "${COOKIE_PREFIX}_$name"; $value =~ s/(\W)/sprintf("%%%02X", ord($1))/eg; print "Set-Cookie: $name=$value; expires=$date\n"; } print "\n"; } #======================== エラーページ出力 ==== 中略 #================== クッキーデータ取り込み ==== sub loadCookie { my $pair; foreach $pair (split(/;\s*/, $ENV{'HTTP_COOKIE'})) { my ($name, $value) = split(/=/, $pair); if(not $name =~ /${COOKIE_PREFIX}_(.+)/) { next; } $name = $1; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $COOKIE{$name} = $value; } } #================== フォームデータ取り込み ==== sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); 中略

  • クッキーの削除がうまくいきません

    <?php setcookie("a","おいしいクッキー"); $a=$_COOKIE["a"]; print "$a"; print "<br />"; setcookie("a","",time()-60); $b=$_COOKIE["a"]; print "$b"; ?> と書いて、クッキーの設定は出来たのですが、有効期限を過去にしても クッキーが削除されずにエラーメッセージが出ます。 エラーメッセージ Warning: Cannot modify header information - headers already sent by (output started at C:\Eclipse\workspace\PHP\cookie.php:7) in C:\Eclipse\workspace\PHP\cookie.php on line 11 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • C フォームから受け取った値をクッキーで発行

    (C言語)フォームから受け取った値をクッキーで発行するにはどのようにするのでしょうか? 問題として ・フォームから値を受け取る事は出来てもクッキーが発行できない もしくは ・フォームから値を受け取れないのにクッキーは発行できる のどっちかしか出来ないため困りました。 どうすればフォームから受け取った値をクッキーで発行できますか? ---以下ソース--- #include <stdio.h> #include <stdlib.h> #include <string.h> int Deta1(char *a,int b,char *nameset[],char *valueset[]); int Dcd(char *set,int a); int get_cookie(char *a,int b,char *nameset2[],char *valueset2[]); void set_cookie(char *valueset[]); void main(void){ int i; int a=0; char *chr=NULL; char *nameset[7]; char *valueset[7]; char *nameset2[7],*valueset2[7]; int b=200; int mode=0; char *ss=getenv("HTTP_COOKIE"); for(i=0;i<7;i++){ nameset2[i]=NULL; valueset2[i]=NULL; } printf("content-type: text/html\n"); //set_cookie(valueset); //ここでset_cookie関数を呼び出せばクッキーは発行出来るけれどフォームに入力された値が入らない printf("\n"); if(mode==0){ //省略しますがフォームで7つの項目があると思ってくださいね if ( getenv("CONTENT_LENGTH")!=NULL ){ a = atoi( getenv("CONTENT_LENGTH") ); } chr=(char *)malloc(a+1); scanf("%s",chr); chr[a] = '\0'; if (a==0){ return ; } printf("%s<br>",chr); int deta1=Deta1(chr,a,nameset,valueset); for(int i = 0;i<deta1;i++){ Dcd(nameset[i],strlen(nameset[i])); Dcd(valueset[i],strlen(valueset[i])); } for(i=0;i<7;i++){ printf("%s %s<br>",nameset[i],valueset[i]); } //set_cookie(valueset); //ここでset_cookie関数を呼び出せばフォームが入力された値が入るけれどクッキーは発行できない int deta2=get_cookie(ss,b,nameset2,valueset2); for(i=0;i<7;i++){ printf("%s %s<br>\n",nameset2[i],valueset2[i]); } free((void *)chr); } else if(mode==1){ //省略 } else{ //省略 } } int Deta1(char *a,int b,char *nameset[],char *valueset[]){ int i=0,cn=0; if(a[0]==NULL){ return(-1); } nameset[0]=a; while((a[++i]!=NULL)&&(i<b)){ if(a[i]=='='){ a[i]=NULL; valueset[cn]=a+i+1; } else if(a[i]=='&'){ a[i]=NULL; cn++; nameset[cn]=a+i+1; } } return cn+1; } int Dcd(char *set,int a){ int i,j; char buf,*tmp; if(a==0){ return -1; } tmp=(char*)malloc(a); for(i=0,j=0;i<a;i++,j++){ if(set[i]=='+'){tmp[j]=' ';continue;} if(set[i]!='%'){tmp[j]=set[i];continue;} if(set[++i]>='A'){buf=set[i]-'A'+10;} else{buf=set[i]-'0';} buf*=16; if(set[++i]>='A'){buf+=set[i]-'A'+10;} else{buf+=set[i]-'0';} tmp[j]=buf; } for(i=0;i<j;i++){ set[i]=tmp[i]; } set[i]='\0'; free(tmp); return 0; } int get_cookie(char *a,int b,char *nameset2[],char *valueset2[]){ int i=0,cn=0; if(a==NULL){ return(-1); } while((a[++i]!=NULL)&&(i<b)){ if(a[i]=='='){ a[i]=NULL; nameset2[0]=a+i+1; } if(a[i]=='-'){ a[i]=NULL; valueset2[cn]=a+i+1; } else if(a[i]=='&'){ a[i]=NULL; cn++; nameset2[cn]=a+i+1; } } return cn+1; } void set_cookie(char *valueset[]){ time_t timer; struct tm *tset; char expires[256]; char *name="sskchat"; int kikan=86400*90; char *set[7]; int i; for(i=0;i<7;i++){ set[i]=valueset[i]; } for(i=0;i<7;i++){ if(set[i]==NULL){ set[i]="no"; } } timer = time(NULL); timer += kikan; tset = gmtime(&timer); strftime(expires, 255, "%a, %d-%b-%Y %H:%M:%S GMT", tset); printf("Set-Cookie:%s=mode-%s&name-%s&mail-%s&hp-%s&cc-%s&gyo-%s&zkou-%s; expires=%s;\n",name,set[0],set[1],set[2],set[3],set[4],set[5],set[6],expires); } ---ソースここまで---

    • ベストアンサー
    • CGI
  • セットしたクッキーを別のドメインで有効にするには

    cgi(perl)を使用してクッキーをセットし、別のドメインに飛んでいくスクリプトを作っています。 例えば、cgiはwww.a.comにあり、クッキーをセットした後、www.b.comに飛びます。 www.b.comで、セットしたクッキーが有効になるようにしようと思ってます。 このような記述で試してみましたが、http://www.b.com/test/ でクッキーが有効になっていません。 書き方が間違っているのでしょうか? print "Set-Cookie: VALUE=hogehoge; path=/test/; domain=www.b.com\n"; print "Location:http://www.b.co.jp/test/\n\n"; ちなみに、クッキーが有効になっているかどうかの判断は、Bookmarkletの「クッキーを表示」を使用して確認しています。 http://bookmarklet.daa.jp/ 宜しくお願いします。

    • ベストアンサー
    • CGI
  • クッキー書き込みが正常に行われない?

    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
  • クッキーについて

    クッキーを考慮し、SESSION管理を使ってスクリプトを作成しています。 webサーバ側に下記phpのスクリプトを設定した場合、 <?php session_name("abc"); session_start(); ?> html ヘッダ情報... ※php.iniにて、クッキーの有効期限を30日に設定。 ※クッキ内容は、 ブラウザ(firefox)の「ツール」→「オプション」→「プライバシー」 →「cookieを表示」ボタンを押して、クッキー名前、内容、有効期限の 確認しています。 ブラウザ側で上記webサーバのホームページにアクセスし、そのホームページで数回リロードを行った場合、リロードするたびにクッキーは、webサーバからブラウザ側へ数回(同じクッキー内容を)送信しているんでしょうか。

    • 締切済み
    • PHP
  • 次のカウンターのCGIプログラムで間違っているところはどこでしょうか?

    参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。 個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。 いろいろ調べたのですが、どこが間違っているのか分からなくなりました。 どうぞお願いいたします。 ======= #!/usr/local/bin/perl $cookie = $ENV{'HTTP_COOKIE'}; @array = split(/; /, $cookie); foreach $tmp (@array){ ($key, $value) = split(/=/, $tmp); if($key eq 'count'){ $count = $value; } } if( $key == ""){ $count = 0; } $count++; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30); @day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat"); @month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec"); $expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec); print "Content-Type: text/html\n"; print "Set-cookie: count=$count; expires=$expireDate \n\n"; Print "<html>\n"; Print "<title>counter4</title>\n"; print "<body>\n"; print "<h1>個人別カウンター</h1>\n<hr />"; print "あなたは$count回目のご訪問です。\n"; print "</body>\n"; print "</html>"; exit;

    • ベストアンサー
    • CGI
  • javascriptでクッキーを書き出しているんですが、確実にクッキー

    javascriptでクッキーを書き出しているんですが、確実にクッキーの値を上書きするにはどうすればいいのでしょうか? 通常では同じkeyがあれば上書きされるはずですよね?それなのに、クッキーの内容を確認すると同じkeyで値が違うものができていて判定ができない状態です。 上書きされないという問題の原因が自分ではわかりません。何か原因があるとすれば解決方法などありますでしょうか? どなたか是非ご教示の程お願いします。 /*クッキー作成の関数*/ function SetCookie(Value){ Expires = new Date(); //日付オブジェクト作成 Expires.setTime(Expires.getTime()+(1000*60*60*24*365)); //デフォルト1年有効 Expires = "expires=" + Expires.toGMTString(); //クッキーの有効期限を作成 SetData = "Area=" + escape(Value) + ";"; //クッキー名=値 を作成 document.cookie = SetData + Expires + ";domain=123456789;path=/;"; //クッキー発行 }

  • 期限内の場合はクッキーを上書きしないようにする方法

    a-site.comとb-site.comとc-site.comの全ページに下のようなJavascriptを埋め込んでクッキーを残そうとしています。 <script type="text/javascript"> <!-- var name = "iriguchi"; // クッキーの名前 var value = "a-site"; // クッキーの値 (サイトごとに変える) var period = 30; // 有効期限(分) // 有効期限の作成 var nowtime = new Date().getTime(); var clear_time = new Date(nowtime + (60 * 1000 * period)); var expires = clear_time.toGMTString(); // クッキーの発行(書き込み) document.cookie = name + "=" + escape(value) + "; expires=" + expires; // --> </script> この場合、a-site.comにアクセスした人がb-site.comにアクセスした場合、a-site.comで書き込まれたクッキーが期限内であっても期限切れでも、b-site.comにアクセスした時点でクッキーの中身は「b-site」に書き換えられ、期限も更新されてしまいます。 これを、クッキーの期限内であればどのサイトを回ろうと最初に書き込まれたクッキーの内容が保持され、期限が切れた時点で新たな内容に書き換えられるようにしたいのですが、それには上のソースに何か書き加える必要がありますよね? 書き方がわからないので文法のむちゃくちゃな自己流で書きますが if (a-site.comで書かれたcookieが期限内){クッキーは前のまま継続} else if (a-site.comで書かれたcookieが期限切れ){新期限 =expires、iriguchi = b-site} といったようにしたいのですが、現在のJavascriptのどこにどういう文を書き加えたらいいでしょうか?

専門家に質問してみよう