我正在建立一个网页。该页面应该能够处理不同的http方法 ( GET, POST...)。我的页面在技术上可以正常工作并处理每种类型的请求,但在GET请求(index.html在根"/"路径上提供服务)的情况下,我的页面无法正确显示。图像或 css 均未正确显示,大概是因为找不到这些文件。我注意到,http.Handle与http.HandleFunc代入server.go下面的代码相比,它提供了更好的结果,因为图像和 css 确实使用以下方法正确显示:http.FileServer(http.Dir("static"))http.Handle("/", http.StripPrefix("/", fs))以下是我的 Web 服务器,图像和 css 未正确显示。一般来说,我的意图是对所有内容使用静态文件,包括 html(例如index.html),并仅使用标准 go 来实现一些解决方案。server.go 代码package mainimport ( "net/http" "fmt")func indexHandler(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content Type", "text/html") switch r.Method { case "GET": http.ServeFile(w, r, "./static/index.html") case "POST": fmt.Pprintf(w, "POST!") case "PUT": fmt.Pprintf(w, "PUT!") case "DELETE": fmt.Pprintf(w, "DELETE!") default: fmt.Pprintf(w, "Default!") }}func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":3000", nil)}
1 回答
繁花如伊
TA贡献2012条经验 获得超12个赞
index.html无论请求什么,您都对服务器进行了硬编码,以便始终为任何 GET 请求返回。因此,如果您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()会返回目录列表,因此您需要检查是否有问题。
- 1 回答
- 0 关注
- 211 浏览
添加回答
举报
0/150
提交
取消