In message <_A73@delegate-ja.ML_> on 10/28/07(17:55:44) you "Keta Suzuki" <pjeaabrv6-mykgh47jw6tw.ml@delegate.org> wrote: |はじめまして。鈴木猛充と申します。 ... |現在、Delegateを使用してWindows 2003 Serverのキャッシュサーバを構築しようと |考えており、動作について検証を実施しております。その検証の中でDelegateの仕 |様を確認したい事象が発生し、メールさせていただいた次第です。 | |もし、この「Delegate御意見箱」をこのような問い合わせに使用すべきでないようで |あ |れば、お手数ですが、その旨ご指摘いただけると幸いです。 ここが適切です。 |私のほうで構築したキャッシュサーバにおいて、以下の現象が発生しています。 | |○現象1 |あるWebサーバ上の静的コンテンツをキャッシュサーバ経由でダウンロードする際、 |HTTPリクエストのHTTPヘッダ中にCookieヘッダが存在すると、キャッシュサーバ |でキャッシュされない。 | |○現象2 |あるWebサーバ上の静的コンテンツをキャッシュサーバ経由でダウンロードする際、 |HTTPレスポンスのHTTPヘッダ中に「Cache-control: no-cache」という記述が存 |在していても、キャッシュサーバでキャッシュされてしまう。 |※このとき、HTTPリクエストのHTTPヘッダ中にCookieヘッダは存在していません。 | |検証を行ったDelegateのバージョンは9.5.0、9.6.1、9.7.5の3種類で、3種類とも同 |様 |の現象が発生しました。DeleGateメーリングリストの閲覧サイトにて同様の事例を探 |してみましたが、上記現象がDelegateの仕様であることを明示しているような記事を |見つけることができておりません。 | |上記現象を回避したいと考えているのですが、以下の点についてご意見をいただく |ことは可能でしょうか? | |(1)「現象1」はDelegateの仕様範囲内の動作と考えてよいか? |(2)「現象1」がDelegateの仕様範囲内であった場合、Delegateにおいて、HTTPリクエ | ストのHTTPヘッダ中にCookieヘッダが存在しても、強制的にキャッシュさせるよう | な設定は可能か? Cookie中の属性が何を意味するかはプロトコルの仕様上は定義されていませんし、 実装者がなにげに、Cookieに依存した応答を、キャッシュの可・不可等の適切な 指示をせずに返してしまう可能性があり、あるいはそのような指示がプロキシ などで無視されることもままあります(DeleGateの場合のように)。特に、応答中に 秘匿すべき情報を含む場合には大問題です(まあ最近ではそういう場合には HTTSP/SSLを使うでしょうけど)。なので、安全のためにDeleGateでは、Cookie ヘッダがある場合(Authorizationがある場合と同様に)デフォルトでキャッシュ 不可としています。 ただしこれは、以下のようなオプションで、解除することができます。 HTTPCONF=cache:cookie |(3)「現象2」はDelegateの仕様範囲内の動作と考えてよいか? |(4)「現象2」がDelegateの仕様範囲内であった場合、Delegateにおいて、HTTPレス | ポンスのHTTPヘッダ中に「Cache-control: no-cache」という記述が存在したら、 | キャッシュさせないような設定は可能か? DeleGateのキャッシュ制御の方針は、10年以上前にまだCookieがそれほど多くは 使われていなかった頃、HTTP/1.0からHTTP/1.1への移行期で実装もまちまちだった 頃に決めたままになっています。その後は、要求があった時に拡張するということ で対処して来ましたが、これまでの要求は「クライアントやサーバの指示を無視 して、なんでもかんでもキャッシュしたい」というものばかりで、上記の HTTPCONF=cache:xxxx というのも、そのために導入したものでした。 キャッシュ制御用のCache-Controlというのも確かHTTP/1.1で導入された「新しい」 機能で、HTTP/1.0の時点ではPragma:no-cacheでさえ、応答ヘッダとしては明確に 定義されていなかったと思います。 応答に no-cache が指定されていたら、それに従う、というのは本来デフォルトの 動作であるべきですが、十数年間デフォルトだった仕様を今更変更するのも問題 ですので、以下のように明示指定した場合に、そのように動作することにしようと 思います。 HTTPCONF=no-cache:no-cache このための変更は、同封のパッチのようになります。9.8.0 に適用しようかと 思います。 なお、最近のDeleGateのソースコードは、(商用ライセンシー向けを除いて) Windowsネイティブの実行形式を作成できるような形では配布されていません。 9 9 ┌─┐┬┌──┬┐ //\^^ ( e ); {Do the more with the less -- B. Fuller} ├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/> ┴ └┴──┘┴────────────────────────────── 佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人) *** ../dist/src/delegate9.7.6/src/http.c Fri Oct 26 06:42:30 2007 --- ./src/http.c Sun Oct 28 22:30:39 2007 *************** *** 109,115 **** --- 109,118 ---- int HTTP_ignoreIf = 0; int HTTP_warnApplet = 0; int HTTP_rejectBadHeader = 0; + /* int HTTP_cacheopt = 0; + */ + int HTTP_cacheopt = CACHE_NOCACHE; #define clntClose HTTP_clntClose #define getFieldValue(str,fld,buf,siz) getFieldValue2(str,fld,buf,siz) *************** *** 5417,5422 **** --- 5420,5431 ---- if( RX_errori == R_UNSATISFIED ) return RX_errori; + if( RX_cachecontrol[0] ){ + if( (HTTP_cacheopt & CACHE_NOCACHE) == 0 ) + if( strheadstrX(RX_cachecontrol,"no-cache",1) ){ + QX_cacheRemove = 1; + } + } if( RX_lastMod == 0 ){ if( RX_code == 302 ){ /* relatively shorter expire time is desired ? */ *** ../dist/src/delegate9.7.6/src/httpd.c Thu Oct 4 09:05:08 2007 --- ./src/httpd.c Sun Oct 28 21:30:13 2007 *************** *** 1735,1740 **** --- 1735,1744 ---- HTTP_opts |= HTTP_NODELAY; } else + if( streq(what,"no-cache") ){ + if( isinList(value,"no-cache") ) + HTTP_cacheopt &= ~CACHE_NOCACHE; + }else if( streq(what,"cache") ){ if( streq(value,"any") ){ HTTP_cacheopt = 0xFFFFFFFF;