代码之家  ›  专栏  ›  技术社区  ›  Zac

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

  •  0
  • Zac  · 技术社区  · 7 年前

    我正在Go中编写一个web服务器,使用 github.com/gorilla/mux 路由器。我的程序检查客户机是否有一个名为“name”的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 因为我没有把饼干做好。在里面 指数html ,有一个表单可以设置cookie并在提交时重新加载页面。

    这就是问题所在。页面重新加载,但由于缓存 指数html 仍显示在浏览器中(尽管服务器实际提供服务 messager.html -我添加了调试日志。)我可以手动重新加载页面任意次数,没有任何差别,但一旦我进行了硬刷新,它就会工作并显示出来 送信人。html

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter saif iqbal    7 年前

    http。ServeFile发送最后修改的头(值设置为文件的mtime),而不发送缓存控制头。在这种情况下,浏览器将实现启发式,以确定响应是否可以缓存以及缓存多长时间。

    要指示客户端不缓存响应,请发送 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")
        }
    }
    

    注意:缓存控制标头实际上是不直观的。例如,有一个名为“无缓存”的值,但这实际上不会导致客户端不缓存响应。仔细阅读文档以获得您想要的效果。

    推荐文章