亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go webserver - 不要使用時間戳緩存文件

Go webserver - 不要使用時間戳緩存文件

Go
開心每一天1111 2021-11-22 18:42:41
我正在嵌入式系統上運行用 go 編寫的網絡服務器。如果有人降級了固件版本,index.html 的時間戳可能會倒退。如果 index.html 比以前的版本舊,服務器會發送一個 http 304 響應(未修改),并提供文件的緩存版本。網絡服務器代碼使用 http.FileServer() 和 http.ListenAndServe()。使用Posix命令修改index.html的時間戳可以輕松重現該問題 touchtouch -d"23:59" index.html重新加載頁面,然后touch -d"23:58" index.html這次重新加載將在 index.html 上給出 304 響應。有沒有辦法防止基于時間戳的緩存?
查看完整描述

1 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

假設您的文件服務器代碼類似于文檔中的示例:


http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("/static"))))

您可以編寫一個處理程序,通過剝離 ETag 標頭并設置Cache-Control: no-cache, private, max-age=0防止緩存(本地和上游代理)來設置適當的緩存標頭以防止這種行為:


var epoch = time.Unix(0, 0).Format(time.RFC1123)


var noCacheHeaders = map[string]string{

    "Expires":         epoch,

    "Cache-Control":   "no-cache, private, max-age=0",

    "Pragma":          "no-cache",

    "X-Accel-Expires": "0",

}


var etagHeaders = []string{

    "ETag",

    "If-Modified-Since",

    "If-Match",

    "If-None-Match",

    "If-Range",

    "If-Unmodified-Since",

}


func NoCache(h http.Handler) http.Handler {

    fn := func(w http.ResponseWriter, r *http.Request) {

        // Delete any ETag headers that may have been set

        for _, v := range etagHeaders {

            if r.Header.Get(v) != "" {

                r.Header.Del(v)

            }

        }


        // Set our NoCache headers

        for k, v := range noCacheHeaders {

            w.Header().Set(k, v)

        }


        h.ServeHTTP(w, r)

    }


    return http.HandlerFunc(fn)

}

像這樣使用它:


http.Handle("/static/", NoCache(http.StripPrefix("/static/", http.FileServer(http.Dir("/static")))))

注意:我最初在github.com/zenazn/goji/middleware 上寫了這個,所以你也可以導入它,但這是一段簡單的代碼,我想為后代展示一個完整的例子!


查看完整回答
反對 回復 2021-11-22
  • 1 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號