为什么会在每个URL请求中提供此服务?

时间:2014-09-10 21:14:45

标签: go

package main

import "fmt"
import "net/http"

func home(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "What!")
}

func bar(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Bar!")
}

func main() {
  http.HandleFunc("/", home)
  http.HandleFunc("/foo", bar)
  http.ListenAndServe(":5678", nil)
}

如果我访问/foobar将会运行。

如果我访问//any/other/pathhome将会运行。

知道为什么会这样吗?我该如何处理404?

2 个答案:

答案 0 :(得分:3)

这是设计行为 - 为以/结尾的路径定义的处理程序也将处理任何子路径。

  

请注意,由于以斜杠结尾的模式命名为带根子树,因此模式“/”匹配所有与其他已注册模式不匹配的路径,而不仅仅是带有Path ==“/".

的URL

http://golang.org/pkg/net/http/#ServeMux

您必须为404实现自己的逻辑。请考虑golang doc中的以下示例:

mux := http.NewServeMux()
mux.Handle("/api/", apiHandler{})
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        // The "/" pattern matches everything, so we need to check
        // that we're at the root here.
        if req.URL.Path != "/" {
                http.NotFound(w, req)
                return
        }
        fmt.Fprintf(w, "Welcome to the home page!")
})

http://golang.org/pkg/net/http/#ServeMux.Handle

答案 1 :(得分:2)

您必须在home处理自己的404。