如何强制客户重新下载我的网站?

时间:2018-04-26 16:17:40

标签: javascript http caching go

我正在使用github.com/gorilla/mux路由器在Go中编写Web服务器。我的程序检查客户端是否有名为" name"并基于此,提供两个文件之一。这是处理函数:

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

这似乎只发生在Firefox上(我已经测试过Safari,Edge和Firefox)。关于如何强制浏览器显示正确页面的任何建议?

1 个答案:

答案 0 :(得分:2)

http.ServeFile发送Last-Modified标头(值设置为文件的mtime),没有Cache-Control标头。在这种情况下,浏览器将实现启发式方法,以确定缓存响应的时间和长度。

要指示客户不要缓存回复,请自行发送Cache-Control header

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”的值,但这实际上并不会导致客户端不缓存响应。仔细阅读文档以获得理想的效果。