問題

私はさまざまなファイルへのアクセスを制御するリソース処理方法を書いています。ブラウザのキャッシュを使用できるようにしたいと思います。私の質問は2倍です:

  1. 304応答を送信する必要があるかどうかを確認するためにチェックする必要がある決定的なHTTPヘッダーと、それらをチェックするときに何を探していますか?

  2. さらに、最初にファイル( 'Last-Modified'など)を200応答として送信するときに送信する必要があるヘッダーはありますか?

いくつかのpsuedo-codeはおそらく最も有用な答えです。


cache-controlヘッダーはどうですか?そのさまざまな可能な値は、クライアントに送信するもの(つまりmax-age)に影響を与えることができますか?

  ベストアンサー

ここで私はそれを実装した方法です。コードは1年以上複数のブラウザで動作しているので、かなり信頼できると思います。これは RFC 2616 に基づいており、さまざまなブラウザが送信していた内容と時刻を観察しています。

擬似コードは次のとおりです。

server_etag = gen_etag_for_this_file(myfile)
etag_from_browser = get_header("Etag")

if etag_from_browser does not exist:
    etag_from_browser = get_header("If-None-Match")
if the browser has quoted the etag:
    strip the quotes (e.g. "foo" --> foo)

set server_etag into http header

if etag_from_browser matches server_etag
    send 304 return code to browser

これを処理する私のサーバーロジックのスニペットがあります。

/* the client should set either Etag or If-None-Match */
/* some clients quote the parm, strip quotes if so    */
mketag(etag, &sb);

etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
    etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
    int sl; 
    sl = strlen(etag);
    memmove(etag, etag+1, sl+1);
    etag[sl-2] = 0;
    logit(2,"etag=:%s:",etag);
}   
... 
apr_table_add(r->headers_out, "ETag", etag);
... 
if (etagin != NULL && strcmp(etagin, etag) == 0) {
    /* if the etag matches, we return a 304 */
    rc = HTTP_NOT_MODIFIED;
}   

etag generation post another question and I'll dig out some code that as well. HTH!

  同じタグがついた質問を見る

language-agnostichttp