如何提供CSS文件并进行动态路由?

时间:2018-06-27 17:19:19

标签: http go server

我正在尝试仅使用标准库在Go中设置HTTP服务器。服务器应该能够接受格式为/:uuid的请求,并且应该能够为index.html文件以及导入其中的css文件提供服务。这是我的代码:

 func indexHandler(w http.ResponseWriter, r *http.Request) {
    // serve index.html
    if r.URL.Path == "/" {
        http.ServeFile(w, r, "./web/index.html")
    } else {
        // if the path is /randomwords, redirect to mapped URL
        randomwords := r.URL.Path[1:]
        url := getMappedURL(randomwords)
        http.Redirect(w, r, url, http.StatusFound)
    }
}

func main() {
  http.HandleFunc("/", indexHandler)
  log.Println("listening on port 5000")
  http.ListenAndServe(":5000", nil)
}

这提供了html文件,并且能够接受诸如/:something之类的请求,但是问题在于它不包含CSS文件。谷歌搜索后,我将主要功能更改为:

func main() {
    fs := http.FileServer(http.Dir("web"))
    http.Handle("/", fs)
    log.Println("listening on port 5000")
    http.ListenAndServe(":5000", nil)
}

这同时提供HTML和CSS文件,但不允许采用:something形式的路由。我不知道如何拥有这两个功能。

1 个答案:

答案 0 :(得分:2)

您的原始解决方案就在附近,您所要做的就是添加一个分支:

if r.URL.Path == "/" {
    http.ServeFile(w, r, "./web/index.html")
} else if r.URL.Path == "/styles.css" {
    http.ServeFile(w, r, "./web/styles.css")
} else {
    // ...

当然可以根据需要进行调整-例如,您可以使用strings.HasSuffix检查任何以“ .css”结尾的文件。