InternetExplorer での挙動なのだが、
1.CGI 経由で出力された FORM 入力画面を表示
2.値を入力して Submit
3.確認画面の表示
4.ブラウザの戻るボタンで前画面に戻る
5.FORM に入力していた値はそのまま保持されている
というのが、まあ、普通の動きだよな。
<input type="button" value="入力ページに戻る" onClick="history.go(-1)">
とか、JavaScriptで前ページに戻る場合も一緒ね。
で、この 3 と 4 の処理の間に、別のページを別タブや別ウィンドウで開いちゃうと、なんとキャッシュがクリアされて 5 の「FORM に入力していた値はそのまま保持されている」が「FORM がリセットされ何も入力されていない状態になる」のだ。
これは、InternetExplorer でだけ発生する問題で、Firefox 等では発生しない。
完全に InternetExplorer のバグだよな。他のタブやウィンドウでWebページを開いたとかどうとか、そういうことがキャッシュの保持に影響しちゃあいかんじゃろう。
別タブとか別ウィンドウでページを開いてる意味がないじゃん。
システム的に考えて、これはバグ以外の何者でもない。:-P
しかし、Microsoft やその信者達は、これは仕様と言い張るのである。馬鹿どもが。
で、この問題は、のほほんのほほんさんが「生涯一マークアップエンジニアだっ!!」というブログで書かれているように、取りあえずは出力する HTML に、
<meta content="86400" http-equiv="Expires"/>
という「明示的にキャッシュを残すようにする」meta ダグを加えてやれば解決する。
俺がわざわざ挙動の説明で「CGI 経由で出力された FORM 入力画面」と書いているのには意味があって、実は、(Apache でしか実験していないが)固定コンテンツの FORM 入力画面ではこのような問題は発生しない。
CGI や PHP で出力した画面で良く発生するのだ。
多分、HTTP ヘッダの違いによる挙動の違いなんだと思うんだな。
ということで、固定コンテンツと CGI の出力の場合でヘッダを比べてみると、
<CGI から出力したコンテンツの場合>
HTTP/1.1 200 OK
Date: Mon, 23 Aug 2010 01:08:16 GMT
Server: Apache
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html;charset=UTF-8
<固定コンテンツの場合>
HTTP/1.1 200 OK
Date: Mon, 23 Aug 2010 01:08:52 GMT
Server: Apache
Last-Modified: Thu, 29 Jul 2010 03:53:09 GMT
Etag: "14939d-1d5b-48c7eac295340"
Accept-Ranges: bytes
Content-Length: 7515
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
むむむ?何か、それっぽい違いはねえなあ。(^^;
固定コンテンツの場合は Cache-Control ヘッダが飛んでるのかと思ったけど、そういうわけでもないような・・・
また分かんなくなっちゃった。
今回、俺は時間がなくてテスト出来なかったんだけど、CGI/PHP 経由で出力した画面の FORM の内容がクリアされてしまうという現象に遭った人は、HTML を吐く時に、
print "Content-type: text/html;charset=UTF-8\n\n";
ってしているところで、
print "Content-type: text/html;charset=UTF-8\n";
print "Cache-Control: max-age=163512\n";
print "Expires: Tue, 24 Aug 2010 22:34:03 GMT\n\n";
とか変えてみて、キャッシュのクリアがおこなわれてしまうか試してみてちょうだい。
(Tue, 24 Aug 2010 22:34:03 のところは、現在時刻に変更してね)
では、結果を待つ。(俺も機会があれば試してみるので。わざわざやるのは面倒くせえ(^^;)
ま、何にせよ、InternetExplorer がこんな糞みたいな(本当はバグの)仕様のせいで、こんなに苦労しないといけないんだけどな。