http.HandleFunc与静态文件

时间:2015-06-28 16:00:59

标签: go

我正在建立一个网页。该页面应该能够处理不同的 UIView.animateWithDuration(duration, animations: { viewController?.view.frame = CGRectMake(0,0,320,568) }, completion: {_ in }) 方法(httpGET ...)。我的页面在技术上适用于处理每种类型的请求,但对于POST个请求(在根GET路径上提供index.html),我的页面无法正常显示。没有任何图像或CSS正确显示,可能是因为找不到这些文件。

Ugly page

我注意到"/"在替换为下面的http.Handle代码时提供了比http.HandleFunc更好的结果,因为图像和css可以使用以下方式正确显示:

server.go

以下是我的网络服务器,图像和css无法正确显示。一般来说,我的目的是为所有东西使用静态文件,包括html(例如http.FileServer(http.Dir("static")) http.Handle("/", http.StripPrefix("/", fs)) ),并使用标准go来实现一些解决方案。

server.go code

index.html

1 个答案:

答案 0 :(得分:0)

您已经对服务器进行了硬编码,以便始终为任何GET请求返回index.html,无论请求的是什么。因此,如果您的index.html包含对style.css的引用,则浏览器将再次发出style.css请求,您将再次返回index.html

我假设你要做的是让所有GET个请求返回静态文件,而其他动词会做其他事情。您只需将它们传递给文件服务器:

root := "static"
...
case "GET":
    if r.URL.Path == "" || r.URL.Path == "/" {
        http.ServeFile(w, r, path.Join(root, "index.html"))
    } else {
        http.ServeFile(w, r, path.Join(root, r.URL.Path))
    }

请注意,在调用处理程序时,URL中的所有“..”引用都已删除,攻击者无法使用它来转义静态树。但是ServeFile()将返回目录列表,因此如果这是一个问题,您需要检查它。