GeckoエンジンのLocationヘッダについての問題

このQ&Aのポイント
  • GeckoエンジンでLocationヘッダを送信し、リダイレクト後にページを更新すると問題が発生しています。
  • リダイレクト先のページのURLが誤判断される現象が起きています。
  • CGI::Sessionを使用してセッション管理をしようとした際、Geckoエンジンで正常に動作しないことが判明しました。
回答を見る
  • ベストアンサー

Gecko エンジンでの Location ヘッダについて

以前に投稿したのですが回答が得られなかったので削除して再質問です。 Gecko エンジンで Location ヘッダを送信してリダイレクトした後の ページで更新(ページリロード)すると反応がおかしいようです。 例えば a というページから b というページにリダイレクトをして b で更新をかけるとページの URL は a であると判断されてしまうよう です。 # 検証用 CGI (index.cgi) use strict; &main(); sub main { my $cgi = &getreq(); my $min = (localtime())[1]; # キャッシュしない print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; if($cgi->{'min'} eq '') { # $cgi->{'min'} が空なら # (Gecko では更新した時にもこっちにくる) print "Location: ./?min=$min\n\n"; exit; } elsif($cgi->{'min'} ne $min) { # 分が異なる場合 (Gecko はこない) print "Content-type: text/plain\n\n"; print "\$cgi->{'min'}=$cgi->{'min'}\n"; exit; } # $cgi->{'min'} と $min が同じ print "Content-type: text/plain\n\n"; print "min=$min\n"; exit; } sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } CGI::Session でセッション管理をしようとしたところ、IE(Trident)と Opera(Presto)では正常なのですがFirefoxでうまく動作しなかったので よく調べてみたところこのような状態です。 どうにかならないでしょうか。 因みに、後で調べてみるとSafari(WebKit) for Winでも正常でした。 現象が発生するのはGeckoのみです。 (Fxの他、SeaMonkeyでも同様の現象を確認しています)

  • CGI
  • 回答数1
  • ありがとう数3

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

ホンットに自信ないですが、 そのページ(CGI)の呼び出しをPOSTで行っているなら、GETに変更するか、 HTTPステータス:303(See Other)でジャンプさせてみてはどうでしょうか?? HTTPステータスについて http://www.onflow.jp/cyano/archives/161 303を吐き出す例 print "Status: 303 See Other\n"; # 追加 print "Location: ./?min=$min\n\n";

pick52
質問者

お礼

お返事ありがとうございます。 なんか上記のコードではそもそも現象が発生しなかったようです。 (以前確認したときは発生したはずなんだけどな...と) なので、一旦質問を締め切って再度別のサンプルを提示することに します。 実際に現象が発生している方でやってみた限りではうまくいっていない みたい(?)です。 ただ、ちょっとヘッダの出力の書き方間違えていた可能性が。

関連するQ&A

  • 続Gecko エンジンでの Location ヘッダについて

    Gecko エンジンでの Location ヘッダについて http://oshiete1.goo.ne.jp/qa4227374.html の続きです。 なんだかよく分からない状況になったのでより実際の処理とほぼ同様の 処理を行っているサンプルを用意しました。 # セッション管理 use strict; use CGI::Session; &main(); # メイン sub main { my $cgi = &getreq(); print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; # セッション取得 my $session = &session($cgi); # セッションが取得できない場合、再取得 if($session == undef) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; $session = &session({}); # セッション ID を取得してリダイレクト my $id = $session->id(); print "Location: ./?CGISESSID=$id\n\n"; exit; } my $id = $session->id(); if($cgi->{'CGISESSID'} eq '' || $cgi->{'CGISESSID'} ne $id) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; # セッション ID が指定されていないまたは # セッション ID が異なる場合リダイレクト print "Location: ./?CGISESSID=$id\n\n"; exit; } print "Content-type: text/plain\n\n"; print "CGISESSID=$id\n"; print "OK\n"; exit; } # CGI リクエストの取得 sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } # セッション取得 sub session { my $cgi = shift; my $dir = { 'Directory' => 'tmp' }; CGI::Session->find(undef, sub {}, $dir); if($cgi->{'CGISESSID'} eq '') { my $session = new CGI::Session(undef, undef, $dir); $session->expire("1h"); return $session; } my $session = CGI::Session->load(undef, $cgi->{'CGISESSID'}, $dir); return ($session == undef || $session->id() eq '') ? undef : $session; } こんな感じのCGIで以下のような状況の時にページを更新すると IE(Trident)/Opera(Presto)及びSafari for Win(WebKit)では 正常に動作するのですがFxやSeaMonkey(Gecko)ではおかしな動作を します。 1. セッションが切れた時 2. セッションファイルを手動で削除した時 具体的にはセッションが切れたら再度新しいセッションを作成して リダイレクトをするようにしてあるのですがGeckoでは一度セッションが 切れると更新する度に新しいセッションを作成するようになってしまい ます。 以前の質問の回答のように Status: 303 See Other ヘッダを出力して 見たのですがやはり効果はないようです。 Cookieは使いたくないのでセッションID(sesid)をCGIリクエストで 送信しているのですがこの方法がまず問題なのでしょうか。 他にも問題のある部分がありましたらご指摘お願いします。

    • ベストアンサー
    • CGI
  • perlでLocation

    Locationでは#xxxというのは使えないのでしょうか? #!/usr/local/bin/perl print "Location:xxx.cgi#xxx/?userID=$name\n\n"; exit; という風に書いています。 xxx.cgiはローカルにあるcgiでそのcgiの中身は表示できます。 しかしxxx.cgiの中の <xxxx.cgiの中身> print <<"EOM"; <html> . . . <A NAME="xxx>image</A> . . . </HTML> EOM exit; xxxのところでなく一番最初が表示されてしまいます。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

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

    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
  • Locationを使いたいのですが

    はじめて質問します。よろしくお願いします。 フォームからデータを受け取って、なんらかの処理をしてから、 locationで別のページへジャンプしたいのです。 下のソースで、ローカル(win95)では正常に動いたのですが、 サーバーに移すと送信後のtest.cgiがエラーになってしまいます。 text.txtへの書込みはちゃんと行われています。 原因がわからなくて困っています。 locationの使い方が間違っているのでしょうか? ↓↓ test.cgiソース ↓↓ ------------------------------------------------------------ #!/usr/bin/perl require 'jcode.pl'; &decode; if ($FORM{'cmd'} eq "regist") { &write; # ファイル書込み print "Location: index.html\n\n"; } else { print <<END; Content-type: text/html <HTML><HEAD><TITLE>タイトル</TITLE></HEAD> <FORM ACTION="test.cgi" METHOD="POST"> <INPUT TYPE=TEXT NAME="message" VALUE=""> <INPUT TYPE=SUBMIT NAME="submit" VALUE="送信"> <INPUT TYPE=HIDDEN NAME="cmd" VALUE="regist"> </FORM> </BODY></HTML> END } exit; # ファイル書込み sub write { open OUT, ">test.txt"; print OUT "$FORM{'message'}\n"; close OUT; }

    • ベストアンサー
    • Perl
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • Perl
  • フォームで入力されたアドレスに内容のコピーを自動返信

    下記フォームのCGIに、フォームで入力したアドレスに内容のコピーを自動で返信したいと考えています。 htmlフォームのメールの項目は、name="mail"です。 $clength = $ENV{'CONTENT_LENGTH'}; if ($clength ne '') { read(STDIN, $query_string, $clength); @elements = split(/&/, $query_string); $i = 0; foreach $element (@elements) { ($key, $buf) = split(/=/, $element); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*key, 'jis'); @name[$i] = $key; $buf =~ tr/+/ /; $buf =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*buf, 'jis'); @value[$i] = $buf; $i++; } $mail = $FORM{'mail'}; &jcode'convert(*sname, 'jis'); &jcode'convert(*subject, 'jis'); &jcode'convert(*ftitle, 'jis'); open (MAIL, "| $sendmail -f $smail $trans"); if ($sname ne '') { print MAIL "From: \"$sname\" <$smail>\n"; } else { print MAIL "From: $smail\n"; } print MAIL "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; print MAIL "Subject: $subject\n"; print MAIL "\n"; print MAIL "$ftitle\n"; print MAIL "\n"; $tmp = '送信内容'; &jcode'convert(*tmp, 'jis'); print MAIL "$tmp\n"; print MAIL "----------------------------------\n"; for($j = 0; $j < $i; $j++) { print MAIL $j+1 . ": @name[$j] => @value[$j]\n"; } print MAIL "------------------------------------\n"; close(MAIL); print "Location: $query_file\n\n"; }

    • 締切済み
    • CGI
  • 文字化け

    下記のようなcgiスクリプトがあり、test1.cgi から リンクの test2.cgiを呼ぶと 「リンドウ」が文字化けしてしまいます。 文字化けしないようにするには、どうしたらいいでしょうか。 Perl cgi 初心者です。 --------test1.cgi----------------------------------------- #!/usr/bin/perl print "Content-Type: text/html; charset=EUC-JP\n\n"; $name="リンドウ"; print "name=$name<br>"; print "<a href=\"test2.cgi?aaa,${name},bbb\">test2.cgi</a>\n"; ---------test2.cgi------------------------------------------------- #!/usr/bin/perl print "Content-type: text/html; charset=EUC_JP\n\n"; $query = $ENV{'QUERY_STRING'}; print "query=$query\n";

    • ベストアンサー
    • CGI
  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • フォームのINPUT NAMEが日本語化け

    CGIがまったく分からない者ですが、会社からホームページ管理を任されてしまいました。INPUT NAMEを日本語にすると文字化けになり、困っております。ご存知の方、どうか中のソースをどう編集したら良いのか細かく頂けたら本当に助かります。 以下、CGIのソースです。 #本文タイトル $honbun_title = '■□ 申込 ■□'; #time #($sec, $min, $hour, $mday, $mon, $year, $wdy, $yday, $isdst) = Localtime(time); $clength = $ENV{'CONTENT_LENGTH'}; if($clength ne '') { read(STDIN, $query_string, $clength); @elements = split(/&/,$query_string); $i = 0; foreach $element (@elements) { (@name[$i], $buf) = split(/=/, $element); $buf =~ tr/+/ /; $buf =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*buf, 'jis'); @value[$i] = $buf; $i++; } &jcode'convert(*honbun_title, 'jis'); &jcode'convert(*ftitle, 'jis'); open (MAIL, "|$sendmail $trans"); print MAIL "From: $smail ($sname)\n"; print MAIL "Subject: $ftitle\n"; # print MAIL "$year\n\n" print MAIL "$honbun_title\n\n"; for($j = 0; $j < $i; $j++) { print MAIL "■@name[$j] : "; print MAIL ": @value[$j]\n\n"; } close(MAIL); print "Location: $query_file\n\n"; }

    • 締切済み
    • CGI

専門家に質問してみよう