キャッシュを完全に無効にさせたい

[上に] [前に] [次に]
やま [E-Mail] 1998/12/08(火) 01:44:56
クッキーを読み込んで、あるキーが設定されているかされていないかによって表示する内容を変えます(CGIを使用して同じURLで)。設定されていなければ、(A)クッキーを設定するためのIDとパスを入力するためのフォームを表示し、認証されればクッキーを設定してLocation:を使用して元のURLへ戻り(B)クッキーが設定されている場合のページを表示させます。
ここで、(A)(B)は同じURLなので、各ページはキャッシュされないように<META HTTP-EQUIV="Pragma" CONTENT="no-cache">を挿入しました。
以上の方法で、Win98+IE,NNでの動作には成功したのですが、Mac+NNで(B)が表示されるべき段階で、元の(A)が表示され、リロードしなければ(B)が表示されないと言う現象が起きているようです。状況から考えてキャッシュが残っているのではないかと、素人の考えをしているのですが、どう思われるでしょうか。
また、Macにキャッシュされない方法が他にあるようでしたら教えていただけませんでしょうか。
長文でややこしい説明ですいません。

moci [E-Mail] 1998/12/08(火) 04:48:22
Mac+NNの環境で、クッキーを無効にしていたりしませんよね?
クッキーが必須である旨、通知されていますでしょうか。

解決策は思い当たりませんが、試しにMETAではなく、
HTTPヘッダでキャッシュさせないようにしてみるというのは
どうでしょう。

どうしようもなければ、(A)と(B)を分けるしかないような…

なべべ 1998/12/08(火) 23:15:58
横槍ですが

HTTPヘッダでキャッシュさせないようにしてみるというのは具体的にはどうするのでしょうか?

B-Cus 1998/12/08(火) 23:44:38
 print "Content-type: text/html\n";
 print "Pragma: no-cache\n\n";
ということだと思います。

これでも無理なら「最初から認証OKのユーザ」と「そこで始めて認証のユーザ」で、
別URLに振る(トップページだけ)、とか。

やま 1998/12/09(水) 00:01:22
HTTPヘッダの方も結果は同じでした。やはり別URLでなければだめなのでしょうかねぇ。もう少し考えてみます。
しかし、根本的にキャッシュに関する問題は解決したとはいえませんね。「解決発言」のチェックは控えておきます。引き続き、解決方法をご存じの方の情報をお待ちいたします。

B-Cus 1998/12/09(水) 01:43:04
> 「そこで始めて認証のユーザ」

「初めて」でしたね。なさけな。

根本的解決じゃないし、別URL案と同じようなものですけど、
(B)のURLに無意味な引数をくっつけて、必ず読みにいかせる
ようにする、というのは?

例えば(A)がhoge.cgiなら、(B)はhoge.cgi?fugaとか。

mura 1998/12/09(水) 18:28:27
「もしかするとできるかも」レベルですが
(Mac+NN以外も含めて私はチェックしたことないです)、
Last-Modifiedヘッダで現在時刻を送るのはどうでしょう?

参考までに、Last-Modifiedの書き方の例(RFC2068より):
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

ばび 1998/12/11(金) 03:53:35
Locationヘッダの変わりに
print "Content-Type: text/html\n\n";
print "<HTML>\n<HEAD>\n";
print "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0\">\n";
print "</HEAD>\n<BODY></BODY>\n</HTML>\n";
っていうのじゃだめですか?
Macは使ったことないからわかりませんけど
キャッシュから読むのを回避できるかもしれません。

しなのむし 1998/12/11(金) 07:40:14
>認証されればクッキーを設定してLocation:を使用して元のURLへ戻り

ここで元のURLに戻らずに

- キーが設定されたか確認
- クッキーが設定されている場合のページの表示

とするとか。

キャッシュを無効するのではなく、キャッシュと関わらない方法を
とるというのはどうでしょう?

やま 1998/12/12(土) 03:34:11
みなさん、アドバイスありがとうございます。
しなのむしさんの方法もわかるのですが、(A)−>(B)だけではなく、その他の(C)や(D)からのリンクでも元のURLへ戻りたいので、やはりはじめの方法でなんとかうまくやりたいのです。わがままですが・・・。
最初にも書きましたように、Winではうまく動作しているので、Mac版NNのバグなのでしょうか。それともno-cacheを無視する設定があるのでしょうか。
ばびさんの方法、リフレッシュだけのためのページを出力するということですね。試していないのですがやってみる価値ありそうですね。

ζ 2000/04/04(火) 11:54:34
<meta http-equiv="expires" content="0">

:-) 2000/04/04(火) 12:45:17
これで完璧ですが。Perl はよーわからんから PHP で。

header("Content-Type: text/html; charset=EUC-JP");
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");             // Date in the past
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");  // always modified
header("Cache-Control: no-cache, must-revalidate");           // HTTP/1.1
header("Pragma: no-cache");                                   // HTTP/1.0
header("Refresh: 0; url=戻り先");

Refresh の代わりに Location でもいいけど環境によっては
ダイアログでてきてウザいから、よろ。

:-) 2000/04/04(火) 13:12:39
きどりみたいな発言になってしまったのでちゃんと Perl で書いてみた。

my (@wdays_en) = qw(Sun Mon Tue Wed Thu Fri Sat);
my (@mons_en)  = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my ($sec,$min,$hour,$day,$mon,$year,$wday) = gmtime(time);
my $gmtime = sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
                     $wdays_en[$wday],$day,$mons_en[$mon],$year+1900,$hour,$min,$sec);

print "Content-Type: text/html; charset=EUC-JP\n";
print "Expires: Sat, 01 Jan 2000 00:00:00 GMT\n";    # Date in the past
print "Last-Modified: ". $gmtime\n";                 # always modified
print "Cache-Control: no-cache, must-revalidate\n";  # HTTP/1.1
print "Pragma: no-cache\n";                          # HTTP/1.0
print "Refresh: 0; url=戻り先\n";
print "\n";

でわでわ。

↑ここにもPHP使いが? 2000/04/04(火) 13:28:11
<?php
header("Content-Type: text/html; charset=EUC-JP");
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");             // Date in the past
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");  // always modified
header("Cache-Control: no-cache, must-revalidate");           // HTTP/1.1
header("Pragma: no-cache");                                   // HTTP/1.0
header("Refresh: 0; url=戻り先");

echo "<html>\n<head>\n";
echo "<meta http-equiv='expires' content='0'>";
echo "<meta http-equiv='Pragma' content='no-cache'>";
echo "</head>";
echo "<body>\n";
echo "<form ************>
.......
.......
.......
echo "</form>\n";
.......
.......
.......
echo "</body>\n</html>\n";
?>

ペンネーム可 2000/04/04(火) 14:00:15
上記のPHPスクリプトを全部書いたページで今実験したら
Win-NT IE5.01の環境でキャッシュが効いていた。
完全にキャッシュをさせないっていうのは無理かも?
ASP,CGI,PHP....幾つつかえるんだ? > :-)

:-) 2000/04/04(火) 14:48:23
> 上記のPHPスクリプトを全部書いたページで今実験したら
> Win-NT IE5.01の環境でキャッシュが効いていた。

そいつはおかしい。
ロヂックてきには問題ないはずだ。^^;

質問の件、PHP なんですが要望どーりのスクリプトあります。

php3_magicticket.tar.gz
http://www.happysize.co.jp/techie/

これでヤフーのようなクッキー認証も実現できるかも。

でわでわ。

ヒソカ 2000/04/04(火) 15:42:31
キャッシュが効くのはブラウザの戻るボタンと
進むボタンを押したときだけなんだけどね。 ^_^

php3_magicticket.tar.gz
これはセキュリティはどうなんだろ?
いつもphplib_7.2をつかってるんだけど。
データベースでユーザー認証する部分は自分で書けって
かいてるみたいだね。

:-) 2000/04/04(火) 18:08:41
> php3_magicticket.tar.gz
> これはセキュリティはどうなんだろ?

md5(md5sum) でハッシュしてサーバーとクライアントで
やりとりしてるので Apache の Basic 認証よりはるかに安全。^^

ヒソカ 2000/04/04(火) 19:01:14
コード見たけど単純で使いやすそうな雰囲気!
クッキイーがだめでもフォームのhiddenでわたせそうだし・・・
Thank you good info!  > :-)

やま 2000/04/04(火) 23:46:54
[[解決]]
最初に発言した「やま」ですよ〜。
1年以上も経って、通知のメールが来たのでびっくりしました。
自分ですら、この質問をしたのを忘れてました。
もうこの方法を使用したページはやめましたので、解決ですね(笑)。
解決チェックしておきます。

[上に] [前に] [次に]