プロが教えるわが家の防犯対策術!

以前に投稿したのですが回答が得られなかったので削除して再質問です。

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でも同様の現象を確認しています)

A 回答 (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";
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
なんか上記のコードではそもそも現象が発生しなかったようです。
(以前確認したときは発生したはずなんだけどな...と)

なので、一旦質問を締め切って再度別のサンプルを提示することに
します。

実際に現象が発生している方でやってみた限りではうまくいっていない
みたい(?)です。
ただ、ちょっとヘッダの出力の書き方間違えていた可能性が。

お礼日時:2008/08/04 23:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!