带有静态文件的 http.HandleFunc

我正在建立一个网页。该页面应该能够处理不同的http方法 ( GETPOST...)。我的页面在技术上可以正常工作并处理每种类型的请求,但在GET请求(index.html在根"/"路径上提供服务)的情况下,我的页面无法正确显示。图像或 css 均未正确显示,大概是因为找不到这些文件。

http://img4.mukewang.com/616d1ca60001434f04860251.jpg

我注意到,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 main


import (

  "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)

}


米脂
浏览 212回答 1
1回答

繁花如伊

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()会返回目录列表,因此您需要检查是否有问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go