为了账号安全,请及时绑定邮箱和手机立即绑定

带有静态文件的 http.HandleFunc

带有静态文件的 http.HandleFunc

Go
米脂 2021-10-18 15:04:46
我正在建立一个网页。该页面应该能够处理不同的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()会返回目录列表,因此您需要检查是否有问题。


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信