簡體   English   中英

如何強制客戶端重新下載我的網站?

[英]How can I force the client to re-download my website?

我正在使用github.com/gorilla/mux路由器在Go中編寫Web服務器。 我的程序檢查客戶端是否有一個名為“ name”的cookie,並根據該cookie提供兩個文件之一。 這是處理程序函數:

func indexHandler(w http.ResponseWriter, r *http.Request) {
    if name, err := r.Cookie("name"); err == nil && name.Value != "" {
        http.ServeFile(w, r, "static/messager.html")
    } else {
        http.ServeFile(w, r, "static/index.html")
    }
}

在Firefox上進行測試,我加載了我的網站,該網站正確地提供了index.html因為我沒有設置cookie。 index.html ,有一種表單可以設置cookie並在提交時重新加載頁面。

這就是問題。 頁面會重新加載,但是由於緩存index.html仍會在瀏覽器中顯示(盡管服務器實際上正在服務messager.html我添加了調試日志。)我可以手動重新加載頁面,次數messager.html 。 ,但是一旦我進行了強制刷新,它就可以工作並顯示messager.html

這似乎僅在Firefox上發生(我已經測試了Safari,Edge和Firefox)。 關於如何強制瀏覽器顯示正確頁面的任何建議?

http.ServeFile發送一個Last-Modified頭(其值設置為文件的mtime),而不發送Cache-Control頭。 在這種情況下,瀏覽器將實施試探法以確定是否可以緩存響應以及將響應緩存多長時間。

要指示客戶端不要緩存響應,請自己發送Cache-Control標頭

func indexHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Cache-Control", "max-age=0")

    if name, err := r.Cookie("name"); err == nil && name.Value != "" {
        http.ServeFile(w, r, "static/messager.html")
    } else {
        http.ServeFile(w, r, "static/index.html")
    }
}

警告:Cache-Control標頭確實不直觀。 例如,有一個名為“ no-cache”的值,但這實際上並不會導致客戶端不緩存響應。 仔細閱讀文檔以獲取所需的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM