[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: w3m-broken-proxy-cache



>> On Wed, 29 Oct 2003 10:14:00 +0900
>> 「山」== yamaoka@jpl.org (Katsumi Yamaoka) said as follows:

山> http://www.asahi.com/national/ は
(中略)
山> というものを返してきました。土屋さんのおっしゃる通りなのですね。で、
山> 申し訳ない、(setq w3m-broken-proxy-cache t) でも emacs-w3m で普通
山> に見たときは問題無いと書いたのは、たぶんぼくの勘違いで、shimbun と
山> 同様に閲覧することができませんでした。

山> まったくわかっていないのですが、ぼくの感覚では `no-cache' はproxy 
山> サーバが受け取って、cache を無視して本来のサーバからデータを持って
山> くるための制御に使われるような気がするのですが、proxy は通り越して
山> 目的のサーバに送られてしまうのですね???

手元で色々試してみたのですが,

    $ telnet www.asahi.com 80
    GET / HTTP/1.1

    HTTP/1.1 400 Bad request
    Server: Netscape-Enterprise/6.0

のように,Host: へッダがないと bad request となるようです.

    $ telnet www.asahi.com http
    GET / HTTP/1.1
    Host: www.asahi.com

    HTTP/1.1 200 OK
    Server: Netscape-Enterprise/6.0

と,Host: へッダを指定すると返事が返ってきました.HTTP/1.1 を定義して
いる RFC2616 によると,

14.23 Host

   A client MUST include a Host header field in all HTTP/1.1 request
   messages. If the requested URI does not include an Internet host
   name for the service being requested, then the Host header field
   MUST be given with an empty value. An HTTP/1.1 proxy MUST ensure
   that any request message it forwards does contain an appropriate
   Host header field that identifies the service being requested by
   the proxy. All Internet-based HTTP/1.1 servers MUST respond with a
   400 (Bad Request) status code to any HTTP/1.1 request message which
   lacks a Host header field.

と,「HTTP server が Host: の欠けている request を受け取った場合は,必
ず bad request を返せ」と指定されています.したがって,Host: をきちん
と指定していない(だろう) proxy server が悪い,ということになりますね.

以下,Pragma: へッダについて折角調べたので,覚え書きです.HTTP/1.0 を
定義している RFC1945 によると,

10.12  Pragma

   The Pragma general-header field is used to include implementation-
   specific directives that may apply to any recipient along the
   request/response chain. All pragma directives specify optional
   behavior from the viewpoint of the protocol; however, some systems
   may require that behavior be consistent with the directives.

       Pragma           = "Pragma" ":" 1#pragma-directive

       pragma-directive = "no-cache" | extension-pragma
       extension-pragma = token [ "=" word ]

   When the "no-cache" directive is present in a request message, an
   application should forward the request toward the origin server
   even if it has a cached copy of what is being requested.

ということで,Pragma: は HTTP/1.0 で既に定義されています.また,
HTTP/1.1 を定義している RFC2616 によると,

14.32 Pragma

   (snip)
   HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client
   had sent "Cache-Control: no-cache". No new Pragma directives will
   be defined in HTTP.

というわけで,きちんと実装された proxy server であれば,
Pragma: no-cache を渡すだけで十分のはずだ,ということになります.

実際に,手元で稼働している squid で試してみたところ,

    $ telnet proxy-server 8080
    GET http://server/ HTTP/1.0

    HTTP/1.0 200 OK
    ...
    X-Cache: HIT from proxy-server
    X-Cache-Lookup: HIT from proxy-server:8080

となり,

    $ telnet proxy-server 8080
    GET http://server/ HTTP/1.0
    Pragma: no-cache

    HTTP/1.0 200 OK
    ...
    X-Cache: MISS from proxy-server
    X-Cache-Lookup: HIT from proxy-server:8080

となって,再読み込みが行われているようでした.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )