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

CGIで作成したフォームでNetscapeからPostするときに

発言者:Junnama
( Date Wednesday, June 06, 2001 00:44:46 )


Junnamaです。

CGIでダイナミックにフォーム付きのhtmlデータを生成し、リプライした後で再度そのフォームからPostする時のことです。

コード自体に問題はない筈なのですが、Netscape(R) Communicator(4.7、Mac版)で再度そのフォームからPostすると、どうもPostされたデータがサーバーで受け取れない時があります(空になる)。

キャッシュが問題のような気がして、ブラウザにキャッシュを残したり残さなかったり、キャッシュの有効期限を設定したりあれこれしてみたのですが、不定期にこの現象が起こります。

話は違うかもしれませんが、GooのページをMacのNetscapeで利用した時、検索結果が何度もリロードされてしまう現象を経験した方はいませんか?
私の想像では、意図的にある一定条件の時にリダイレクトの指示を出していて、Netscape(Mac)が正しく反応してくれないことによってこの現象が起こるような気がしてしょうがないのですが、同様の経験をお持ちの方、回避方法を御存じの方はいらっしゃいますでしょうか?

IEではまず起こらないのですが...

Junnama さんからのコメント
( Wednesday, June 06, 2001 00:46:01 )

すいません、改行忘れ(^^;)

CGIでダイナミックにフォーム付きのhtmlデータを生成し、リプライした後で
再度そのフォームからPostする時のことです。

コード自体に問題はない筈なのですが、Netscape(R) Communicator(4.7、Mac
版)で再度そのフォームからPostすると、どうもPostされたデータがサーバー
で受け取れない時があります(空になる)。

キャッシュが問題のような気がして、ブラウザにキャッシュを残したり残さな
かったり、キャッシュの有効期限を設定したりあれこれしてみたのですが、不
定期にこの現象が起こります。

話は違うかもしれませんが、GooのページをMacのNetscapeで利用した時、検索
結果が何度もリロードされてしまう現象を経験した方はいませんか?
私の想像では、意図的にある一定条件の時にリダイレクトの指示を出していて、
Netscape(Mac)が正しく反応してくれないことによってこの現象が起こるよ
うな気がしてしょうがないのですが、同様の経験をお持ちの方、回避方法を御
存じの方はいらっしゃいますでしょうか?

IEではまず起こらないのですが...

shoma/島原 さんからのコメント
( Thursday, June 07, 2001 12:24:16 )

経験したことはないのですが...(^^;

もし、頻繁に起こるようでしたら、まずは、Interarchyなどで、
NetscapeCommunicator(?)から送っている実際のデータをみて
みてはいかがでしょう?

→  InterArchy

Junnama さんからのコメント
( Thursday, June 07, 2001 12:53:53 )

わかったことがあります。
実際にEasy BBS等では起らないことなので、何が違うのか自分なりに考えてみた
のですが。

まず、起るのは、CGI(acgi)をして作成した時に、そのCGIを直接呼び出して動
かすタイプであること(PreProcesserやユーザー定義アクションではないこと)。

そして、CGIは一つで、パラメーター(getの場合のURLの?の後ろやポストデータ
の一部(隠しフィールド)によって処理を振り分けている場合。

作っているのはスケジューラのようなもので、

1.表示
GET /xxx.acgi?0
→今日から7日間の予定を表示。予定を投稿するフォーム付き

GET /xxx.acgi?7
→その後の7日間の予定を表示。予定を投稿するフォーム付き

2.投稿
POST /xxx.acgi
そのフォームから同じCGIへポストする場合
(つまり、?以下が空で、リクエストがPOSTの場合は投稿とみなし、処理を行い、
 ポスト後は、投稿元ページ(/xxx.acgi?0 等)にリダイレクトしていました)

という感じで、全てCGIのパスは /xxx.acgi になるように作っていた時に発生
しました。

OTSessionWatcherでトレースしたら、実は送信はきちんとできていたのですが、
CGIアプリケーションでは受け取れないことがままあります。

そこで、ユーザー定義アクションを指定して、送信時と投稿時のパスを変えてや
ることで、この問題は発生しないようになりました。

ユーザー定義アクションで拡張子  jtml → xxx.acgi を指定
1.表示
GET /get.jtml?0
GET /get.jtml?7
...

2.投稿
POST /post.acgi

とすることで回避されました。
解決したものの、なんだかスッキリしないです...

田中求之 さんからのコメント
( Thursday, June 07, 2001 16:53:51 )

>OTSessionWatcherでトレースしたら、実は送信はきちんとできていたのですが、
>CGIアプリケーションでは受け取れないことがままあります。

Web サーバにはデータが送られていたが、CGI アプリケーションにはデータが
送られていなかった、ということでしょうか?

>ポスト後は、投稿元ページ(/xxx.acgi?0 等)にリダイレクトしていました

このやり方をするときには、ブラウザがページのキャッシュを使わないように、
キャッシュのコントロールを行う必要があります(リダイレクトの指示を受けたら、
必ずサーバへ読みにいくように)。ただ、完全なキャッシュのコントロールは
なかなか難しいんですよね。そこで、すでに Junnama さんが取られたように、
投稿の際の URL が、表示用の URL とは違うようにしておく、というのが
確実な方法出です。EasyBBS もこの方法を使っています(キャッシュの有効
期限のコントロールと合わせて)。

Junnama さんからのコメント
( Thursday, June 07, 2001 20:23:39 )

>Web サーバにはデータが送られていたが、CGI アプリケーションにはデータが
>送られていなかった、ということでしょうか?

Netscapeからは確かに送れたのですが、CGIにはデータが来ていません。
サーバーに来ているかどうかはちょっとわかりません。

キャッシュについては、

1.キャッシュを残さない場合
2.有効期限を現在時刻にした場合

いずれでも発生しました。
また、表示の際に有効期限を1分にしたときに2分後にポストしたときにも発生し
ました。

サーバーはQPQ1.02、サーバーのキャッシュはオフにしています。
OSは9.04
クライアントはNetscapeCommunicator 4.7です。

やはりURLを変えるのが確実だと思います。

Junnama さんからのコメント
( Thursday, June 07, 2001 23:38:26 )

ユーザー定義アクションで拡張子  jtml → xxx.acgi を指定
1.表示
GET /get.jtml?0
GET /get.jtml?7
...

2.投稿
POST /post.acgi→ post.jtml の間違いでした(^^;
      ↑     ↑