[Date Prev][Date Next][Thread Prev][Thread Next][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 )