問題

我正在編寫一個資源處理方法,我控制對各種檔案的訪問,我希望能夠使用瀏覽器的快取.我的問題是兩倍:

  1. 我需要檢查哪些是確定的HTTP標頭,以確保我是否應該傳送304響應,當我檢查它們時,我正在尋找什麼?

  2. 此外,當我最初發送檔案(如’Last-Modified’)作為200個響應時,是否需要傳送任何標題?

一些 psuedo-code 可能是最有用的答案。


cache-control頭怎麼樣?這些可能的值可能會影響你向客戶端傳送的內容(即max-age)還是隻應該遵守if-modified-son?

  最佳答案

這是我實現它的方法.程式碼一年多來一直在使用多個瀏覽器,所以我認為它非常可靠.這是基於 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生成的幫助釋出另一個問題,我會挖掘一些程式碼也這樣做. HTH!

  相同標籤的其他問題

language-agnostichttp