小编典典

http.FileServer缓存文件并在编辑后提供旧版本

go

go的核心部分存在http包问题。尽管响应正文中的Content-Length是正确的,但似乎文件内容已缓存。这里展示的是我正在编写的应用程序的简化版本。

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("./www/")))
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        fmt.Println(err)
    }
}

现在假设我们有一个非常简单的html页面:

<!doctype html>
<html>
<body>
    <p>Hello there</p>
</body>
</html>

我执行go程序并http://localhost:8080在浏览器中访问以显示:

Hello there

检查响应头,我可以看到以下内容:

Status Code:200 OK
Accept-Ranges:bytes
Content-Length:68
Content-Type:text/html; charset=utf-8
Date:Fri, 20 Dec 2013 10:04:03 GMT
Last-Modified:Fri, 20 Dec 2013 10:03:32 GMT

现在,我编辑html文件,以便<p>标记包含Hello there everyone并重新加载页面。我得到以下内容:

Hello there

再次查看响应标题

Status Code:200 OK
Accept-Ranges:bytes
Content-Length:77
Content-Type:text/html; charset=utf-8
Date:Fri, 20 Dec 2013 10:04:34 GMT
Last-Modified:Fri, 20 Dec 2013 10:04:14 GMT

因此,Content- Lengthhttp.FileServer处理程序已更改以及最后修改的内容,但未更改该内容。即使关闭程序并执行此问题,也会发生go run src/.../main.go。到目前为止,我发现清除文件的明显缓存版本的唯一方法是重新启动运行程序的计算机。

我尝试了以下方法:

  • 在Win / Ubuntu / OSX 10.8.5上执行程序
  • 浏览golang.org/src上的功能/接口链,以查看所提供的文件是否缓存在磁盘上的任何位置

任何帮助,将不胜感激。


阅读 303

收藏
2020-07-02

共1个答案

小编典典

好的,所以在忽略问题并继续前进几个星期之后,我终于弄清了问题所在。

为了使我的主计算机完全不受定制,我使用Vagrant使用golang,nodejs和php开发应用程序。看来,在Virtual
Box共享上运行go应用程序并在该共享上存储所有html文件都会导致此问题。

为了证明这一点,我打开了一个Vagrant框,将文件从/ vagrant共享目录复制到/ home / vagrant / testing
/,然后复制了前面列出的所有操作。这使问题消失了。

因此,换句话说,不要使用Virtual Box共享文件夹托管打算在http.FileServer方法中使用的文件。

2020-07-02