このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

ブラウザに毎回サーバにアクセスさせる方法?

発言者:礒野@とし研
( Date Saturday, March 07, 1998 01:35:02 )


訳が分からなくなってきたので助けて下さい。

所員のスケジュール表のCGIを作っています。縦に所員の名前、横に月〜金の1
週間毎のスケジュール表を表示し、電話応対の便を図ろうというものです。

テーブルタグで作った1週間毎のスケジュール表のhtmlファイルを作り、各自
のスケジュールはhtmlファイルの該当するセルに保持します。AppleScriptの
CGIでこのhtmlファイルを操作して、書込・修正を行います。

一応出来上がって、このCGIを ".srtr" という拡張子で ACTION 登録しました。
(サーバはqpq1.0.2)

スケジュール表の表示は、<A>タグを使って、"/schedule.srtr?980223" などと
いうURLで、月曜日の日付けをsearch_argsに納めて要求すると、スクリプト側
でその週のファイルを読み込んでリプライする形にしました。

htmlファイルを単純に指定したのでは修正内容が反映されないので、CGIを通し
て表示させたつもりなのですが、再読み込みボタン以外では、ブラウザのメモリ
の内容を表示してしまって、修正内容が反映されず困っています。

しかし同じCGIの中の、書込・修正画面を表示させるところはでは、同様に<A>
タグで "/appoint.srtr?980223_1_2"(2/23の週の、1番の所員の、2=火曜日)
と要求するのですが、毎回サーバに読みに行くのです。
ただしこの場合は、同じURLで、書込・修正の内容をpost_argsに納めてPOSTす
るので、一つのURLに対する結果が一定ではありませんが。

確実にサーバに読みに行かせるにはどうすればいいのでしょうか。
どなたか、御示唆を!!

#もっとダイナミックというか、相対的な日付けの指定にすればうまく行きそ
#うな気もするのですが、理屈を知りたくなりました。

吉田 達矢 さんからのコメント
( Saturday, March 07, 1998 02:14:39 )

他にもっと有効な手だてについてレスされるかもしれませんが、
とりあえず、私は、簡単で手っ取り早いので以下の方法を使っています。
<head>にMETAイベントを書いてブラウザ側のキャッシュを無視させられます。

  <meta http-equiv="Pragma" content="no-cache">

ページ内にEMBEDされたplug-inについては、httpの埒外なのでキャッシュから
呼び込まれてしまいますが、通常のhtmlとhttpについては、キャッシュを
無視します。

おためしください。



田中求之 さんからのコメント
( Saturday, March 07, 1998 17:06:23 )

>確実にサーバに読みに行かせるにはどうすればいいのでしょうか。
>どなたか、御示唆を!!

吉田さんからのコメントにあるように、Pragma: no-cache を HTTP ヘッダに
埋め込むことで、どんな場合でも(Back/Forwordのボタンでページを移動した
場合でも)、必ずサーバーへアクセスにいくようになります。

"HTTP/1.0 200 OK" & crlf ツ
& "Pragam: no-cache" & crlf ツ
& "Content-type: text/html; charset=Shift_JIS" & crlf & crlf

という HTTP ヘッダーを使うわけです。


>#もっとダイナミックというか、相対的な日付けの指定にすればうまく行きそ
>#うな気もするのですが、理屈を知りたくなりました。

CGI が返す HTTPヘッダの中に、データの有効期限を指定する Expires ヘッダーを
使うことで、一定の間はキャッシュを使って表示が行われ、それ以後はサーバーにデータ
の確認にいく、という動作を行わせることができます(この会議室では、この仕組みを
使っています)。

Expires での日付は RFC1123 フォーマットで、GMT を使って指定する必要が
ありますので、この辺がちょいと面倒なところですが、あとで、非常に単純な
サンプルを登録しておきますので、それを参考にしてください。

なお、HTTPヘッダを活用した CGI による Web のコントロールについては、
4月に発売になる Macintosh Developer Journal 用に詳しく解説した
記事を書いておきましたので(かなり長い記事を書いたので、一度に掲載され
るかどうかわからないんですが (^_^;; )、そちらも見てもらえるとよい
かと思います。

田中求之 さんからのコメント
( Saturday, March 07, 1998 17:24:54 )

EXpires ヘッダを使ったサンプルです。以下のスクリプトを、たとえば exp.acgi と
言う名前で CGI アプリケーションにしてアクセスしてみてください。そしてブラウザの
Back/Forowd を使ってページ移動を行ってみて、どのように表示されるか確かめて
みてください。アクセスしてから1分間はブラウザのキャッシュを使って表示が
行われますが。アクセスしてから1分が過ぎると、サーバーへ再びアクセスを
行います(サーバーのログにも注意)

===

--- Tanaka's osax が必要

property crlf : (ASCII character 13) & (ASCII character 10)

on ヌevent WWWスsdocネ path_args
  
  
  set xDate to (current date) - (time to GMT) + 60 --- 1分間有効
  set dateStr to DateToHeaderStr xDate with as1123
  
  return "HTTP/1.0 200 OK" & crlf ツ
    & "Expires: " & dateStr & " GMT" & crlf ツ
    & "Content-type: text/html; charset=Shift_JIS" & crlf ツ
    & crlf ツ
    & "<TITLE>Expires Header Sample</TITLE>" & crlf ツ
    & "<H2>Expires ヘッダーのサンプルです</H2>" & crlf ツ
    & "<H3>1分間はキャッシュが使われ、その後はサーバーへアクセスがいきます</H3>" & crlf ツ
    & "<H4>アクセス:" & ((current date) as string) & "<P>" & crlf ツ
    & "有効期限:" & (((current date) + 60) as string) & "</H4>"
  
end ヌevent WWWスsdocネ

礒野@とし研 さんからのコメント
( Sunday, March 08, 1998 00:05:18 )

吉田さん、田中さん、コメントありがとうございます。

Expires ヘッダと、以前に田中さんがここで紹介して下さった CONDITIONAL_GET
を組み合わせることで、必ずサーバにアクセスして、更新されていなければキャ
ッシュを使うという、希望通りの状態になりました。

#Expires ヘッダに現在の時刻を指定するのは邪道ですかね...

Developer Journal 楽しみにしています。

吉田 達矢 さんからのコメント
( Sunday, March 08, 1998 00:29:50 )

此の会議室も既にそのような制御を受けているとは知りませんでした。
HTTPは奥が深いですね。

私も、Developer Journalを入手して、勉強したいと思います。

田中求之 さんからのコメント
( Sunday, March 08, 1998 03:04:37 )

>HTTPは奥が深いですね。

奥が深い、というより、普段は表に出てこないものなので、皆気がついていない
んですよね、Web って、言ってしまえば HTTP ヘッダがすべてだってことに。

ブラウザが要求したデータをサーバーが送り返す、この単純きわまりない仕組み
を核にして、ここまで色々な事が可能になっているメカニズムは、すべて HTTP
ヘッダによるサーバーとブラウザ間の情報のやり取りに鍵が秘められています。
これを理解し、活用することで、CGI の可能性はぐんと広まりますよ。

HTTPについては、基本的には W3C で公開されているドキュメントや RFC を
見ればいいのですが、これらは読みやすいとは言えません。参考になる文献と
しては

『Web クライアントプログラミング』

という本がオライリー・ジャパン(発売オーム社)から出ています。これは Perl
を使ってブラウザ側のプログラミング(たとえば Web のオートパイロットのような)
を行うためのガイド本なのですが、この中に HTTP (HTTPヘッダ)に解する解説
も載ってます。¥2900もしますし、全体としては Perl のプログラミングの
話が中心なので、買うまでもないとは思いますが、時間があるときに、本屋で
じっくり立ち読みしてください。HTTP ヘッダや HTTP というプロトコルなんて
ものを気にしたこともなかったというひとには、発見が多いと思います。

2章、3章、付録Aがチェック個所です。

よしもと さんからのコメント
( Sunday, March 08, 1998 09:58:54 )

田中さん:
>>買うまでもないと思いますが、

いえ、いえ、買う価値はありますよ(笑)
これを買って、皆でPerlを始めよう (^^;

吉田 達矢 さんからのコメント
( Sunday, March 08, 1998 16:07:46 )

>>『Web クライアントプログラミング』

こう言う本が、出てたのですね。
乏しい英語力で、W3Cのドキュメントを広い読みしてましたので、
早速、入手したいと思います。

貴重な情報をありがとうございました。