web-dev-qa-db-ja.com

304 Not Modifiedレスポンスには「Last Modified」ヘッダーを含める必要がありますか?

最も優れた http://redbot.org テストツールを使用して、サイトのHTTPヘッダーが正しいことを確認しました(動的コンテンツを提供するPHPのカスタムコード-したい可能な場合はキャッシュされるようにします-Apache2によって提供されます)

テストの1つは言う:

The If-Modified-Since response is missing required headers

HTTP requires 304 Not Modified responses to have certain headers, if they are also present in a normal (e.g., 200 OK response).
This response is missing the following headers: last-modified.
This can affect cache operation; because the headers are missing, caches might remove them from their cached copies.

...したがって、resonseにはLast-Modifiedヘッダーが含まれません。ただし、コードは送信しようとします。さらに調査すると、ApacheはHTTPヘッダーのホワイトリストを使用しているようで、304の応答を許可します...

if (r->status == HTTP_NOT_MODIFIED) {
    apr_table_do((int (*)(void *, const char *, const char *)) form_header_field,
                 (void *) &h, r->headers_out,
                 "Connection",
                 "Keep-Alive",
                 "ETag",
                 "Content-Location",
                 "Expires",
                 "Cache-Control",
                 "Vary",
                 "Warning",
                 "WWW-Authenticate",
                 "Proxy-Authenticate",
                 "Set-Cookie",
                 "Set-Cookie2",
                 NULL);
}
else {
    send_all_header_fields(&h, r);
}

これは、Apache HTTPD 2.2.22ソースコードのmodules/http/http_filters.cの1281行目付近にあります。

....「Last-Modified」はそのリストにありません。

では、問題は-間違っている、redbot、またはApacheですか?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html は、Last-Modifiedを含めるかどうかを指定していないようです。 (Etagは-であるべきだと言っており、Apacheリストで許可されています)

便利なケースに入れて、これがテストケースです: http://redbot.org/?uri=http%3A%2F%2Fwww.geograph.org.uk%2Fhelp%2Fsitemap -私のコードはLast-Modifiedヘッダーをインクルードします。そのredbotはそれを取得しません(カスタムX- ..ヘッダーも)。

5
barryhunter

正解です。 REDは、HTTPbis http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-18#section-4.1 の要件を実装しました。

通常、HTTPbisの要件はRFC2616と下位互換性があります(つまり、現在は2616の非準拠に準拠した実装は行われていません)が、この変更はすり抜けました。それを修正するために問題を公開します。それまでは、REDの要件を変更します。

5
Mark Nottingham

いいえ、RFC 2616から引用したように、Last-Modifiedは不要です。この問題を発見しました https://github.com/mnot/redbot/issues/61 必要なヘッダーのチェック。しかし、彼らはこの問題で「日付」だけが必要であると述べましたが、実装は異なっていました(間違っていると思います)。

3
jcisio