日向夏特殊応援部隊

俺様向けメモ

If-None-Matchに「*」をつけたときの挙動

http://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/http/http_protocol.c の 334行目付近参照。

    if_nonematch = apr_table_get(r->headers_in, "If-None-Match");
    if (if_nonematch != NULL) {
        if (r->method_number == M_GET) {
            if (if_nonematch[0] == '*') {
                not_modified = 1;
            }
            else if (etag != NULL) {
                if (apr_table_get(r->headers_in, "Range")) {
                    not_modified = etag[0] != 'W'
                                   && ap_find_list_item(r->pool,
                                                        if_nonematch, etag);
                }
                else {
                    not_modified = ap_find_list_item(r->pool,
                                                     if_nonematch, etag);
                }
            }
        }
  1. If-None-Matchがセットされていて
  2. GETメソッドで
  3. if_nonematch[0]が「*」だったら

なんとNot Modifiedと言う判別になるみたい。(via ETag とキャッシュの関係(リベンジ→未解決), ETag とステータスコード 200 or 304 - まちゅダイアリー(2007-01-07))

試してみましょう。

$ lwp-request -m GET -H 'If-None-Match: *' -U -s -e -d http://localhost/test2/logo.gif 
GET http://localhost/test2/logo.gif
If-None-Match: *
User-Agent: lwp-request/2.07

304 Not Modified
Connection: close
Date: Mon, 13 Aug 2007 10:15:56 GMT
ETag: "2232"
Server: Apache/2.2.4 (Unix)
Client-Date: Mon, 13 Aug 2007 10:15:56 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1

ほんとだ。

蛇足だけどHEADリクエストにしても同じ結果になります。