我正在使用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)。关于如何强制浏览器显示正确页面的任何建议?
答案 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”的值,但这实际上并不会导致客户端不缓存响应。仔细阅读文档以获得理想的效果。