静态文件缓存问题

代码是这样的

// static files
http.Handle("/static/", http.StripPrefix("/static", http.FileServer(http.Dir(settings["root"]+settings["static"]))))

但是无论我怎么更新静态文件,重启服务器,静态文件总是没有更新,但也不是完全不更新 比如说我有一个 /static/css/main.css 文件, 内容修改为

body {

}

然后访问得到的结果是一串字符串加一串乱码

sfguibrgin�����

如果我把文件清空,访问的内容也为空了。恰好,前面那串未乱码的字符串是我最初写入到这个文件的内容。

然后我再建一个文件 main2.css

写入

body {

}

第一访问得到的内容和上面一致,然后我修改 main2.css 为

body {
    background:;
}

再刷新,又得到下面的东西 =.=

body {

}������������

貌似是只要访问一次之后就再也不能修改了 =.=

求大神破。谢谢啊!

共 14 个回复


jimmykuu

用Chrome开发者工具看下Headers有没有什么问题,我测试没有这个问题,而且也没有缓存,不用重启服务器,修改后直接生效。

# 0

Rabbit_52

Headers 如下。谢谢回复 :)

enter image description here

# 1

Rabbit_52

我贴一下我main()吧,不知道是不是我姿势有问题~

func main() {
    // func routers
    settings = loadSettings()
    for rule, funcname := range Urls {
        http.HandleFunc(rule, funcname)
    }
    // static files
    http.Handle("/static/", http.StripPrefix("/static", http.FileServer(http.Dir(settings["root"]+settings["static"]))))
    err := http.ListenAndServe(":8888", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
# 2

jimmykuu

一下子也看不出问题在哪,你用这个最简单的测试下会不会这个问题。

package main

import (
    "net/http"
)

func main() {
    http.Handle("/static/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":8080", nil)
}

/static目录和go文件在同一个目录下。

# 3

Rabbit_52

刚刚测试了,还是有这个问题呢!!!

跟上面一样。

如果我换成 .txt 的后缀浏览器会直接下载

控制台是这样的

enter image description here

enter image description here

# 4

jimmykuu

有服务的话,部署到服务器上帮你测试下,确认下是浏览器还是服务器端的问题。

# 5

Rabbit_52

我用的本地Ubuntu试,我待会儿部署一个到VPS上试试

# 7

Rabbit_52

我刚刚尝试了从宿主机挂载的目录拷贝到虚拟机的非挂载目录再执行,就没有这个问题了。我怀疑是virtualbox共享文件服务的问题,我fstab里面写的挂载模式都是defaults,挂载后的所有目录和文件的权限都是 777

# 9

Rabbit_52

而且有这个问题,Windows作为宿主机挂载到虚拟机的目录和文件是不能执行 chmod 修改文件权限的,而 Unix 或者 linux 的宿主机挂载过去就能修改

# 10

jimmykuu

看来是虚拟机的问题,这块没研究过,文件系统是VBoxSharedFolderFS,很真实环境是有不同的。

# 11

Rabbit_52

谢谢帮忙解决 :)

# 12

Rabbit_52

最后为了实现在Windows下开发 在linux虚拟机里面交叉编译,然后在Windows下面运行,就没有上面的问题了

# 13