【发布时间】:2013-12-20 11:05:09
【问题描述】:
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-Length 已更改以及上次修改,但不是 http.FileServer 处理程序传递的实际文件内容。即使在关闭程序并执行go run src/.../main.go 之后也会发生此问题。到目前为止,我发现清除明显缓存的文件版本的唯一方法是重新启动正在运行程序的机器。
我尝试了以下方法:
- 在 win/ubuntu/osx 10.8.5 上执行程序
- 通过 golang.org/src 上的函数/接口链查看服务文件是否缓存在磁盘上的任何位置
对此的任何帮助将不胜感激。
【问题讨论】:
-
您使用的是网络浏览器还是命令行工具?
-
感谢您的输入,请阅读 cmets。我已经使用多个 Web 浏览器、命令行工具以及在 Windows、Linux 和 Mac 上运行 go 服务器复制了这种行为。
-
我无法使用这个版本
go version go1.2 darwin/amd64重现问题。