Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何强制客户端重新下载我的网站?_Javascript_Http_Caching_Go - Fatal编程技术网

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

Javascript 如何强制客户端重新下载我的网站?,javascript,http,caching,go,Javascript,Http,Caching,Go,我正在使用github.com/gorilla/mux路由器在Go中编写一个web服务器。我的程序检查客户机是否有一个名为“name”的cookie,并基于此提供两个文件中的一个。以下是处理函数: func indexHandler(w http.ResponseWriter, r *http.Request) { if name, err := r.Cookie("name"); err == nil && name.Value != "" { http

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

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


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

http.ServeFile发送上次修改的头(值设置为文件的mtime),但不发送缓存控制头。在这种情况下,浏览器将实现试探法来确定响应是否可以缓存以及缓存多长时间

要指示客户端不缓存响应,请自行发送:

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")
    }
}

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

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

要指示客户端不缓存响应,请自行发送:

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")
    }
}

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

设置适当的标题,这样您的页面就不会被缓存?我不一定不想缓存它-毕竟缓存存在是有原因的。我只想在某些条件下,确保浏览器使用新版本。我想永远不缓存它可能会更容易。听起来像是s的作用。@Flimzy这不是强制/不强制刷新-我可以用JavaScript来实现。我需要确保浏览器使用的是我发送给它的实际HTML。设置适当的标题,这样你的页面就不会被缓存?我不一定不希望它被缓存-毕竟,缓存存在是有原因的。我只想在某些条件下,确保浏览器使用新版本。我想永远不缓存它可能会更容易。听起来像是s的作用。@Flimzy这不是强制/不强制刷新-我可以用JavaScript来实现。我需要确保浏览器使用我发送给它的实际HTML。根据您对该问题的评论,您可能确实在寻找类似
max age=60的内容,必须重新验证
plus ETags。no-store也不会阻止缓存。它阻止响应的长期存储(例如,在磁盘上)。如果它对你有效,那很可能是一个浏览器怪癖,而不是所有的浏览器都一样
max age=0
是防止缓存的标准值。根据您对该问题的评论,您可能确实在寻找类似
max age=60,必须重新验证
plus ETags的内容。no-store也不会阻止缓存。它阻止响应的长期存储(例如,在磁盘上)。如果它对你有效,那很可能是一个浏览器怪癖,而不是所有的浏览器都一样
max age=0
是防止缓存的标准值。