如何限制用golang编写的web服务器来允许特定地址而不是模式?

时间:2015-08-07 12:03:53

标签: http go server url-pattern

当我使用

http.HandleFunc("/", serveRest)  //serveRest is the method to handle request
http.ListenAndServe("localhost:4000", nil)

它将接受以"/"开头的所有请求。如何将其限制为仅"localhost:4000"而不是"localhost:4000/*"等每个地址?

你们可以给我一个很好的Go教程吗?

2 个答案:

答案 0 :(得分:6)

您注册处理程序的URL模式记录在http.ServeMux类型:

  

模式名称是固定的,有根的路径,例如" /favicon.ico"或根管子树,例如" / images /" (注意斜杠)。较长的模式优先于较短的模式,因此如果有两个处理程序注册了" / images /"和" / images / thumbnails /",后面的处理程序将被调用路径开始" / images / thumbnails /"前者将接收" / images /"中任何其他路径的请求;子树。

     

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

所以不幸的是,没有模式只匹配根("/")。

但是你可以在你的处理程序中轻松检查这个,如果请求路径不是root,你可以做任何你想做的事情:

func serveRest(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        w.Write([]byte("Not root!"))
        return
    }

    w.Write([]byte("Hi, this is the root!"))
}

如果您想为非root返回HTTP 404 Not found错误:

func serveRest(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        http.NotFound(w, r)
        return
    }

    w.Write([]byte("Hi!"))
}

Go教程:https://tour.golang.org/

另请查看SO上的 Go 标记信息,它有 Go Tutorials 部分。

答案 1 :(得分:1)

你可以退房 https://github.com/julienschmidt/httprouter

根据其自述文件:

  

仅显式匹配:使用其他路由器,如http.ServeMux,a   请求的URL路径可以匹配多个模式。因此他们有   一些尴尬的模式优先级规则,如最长匹配或第一   注册,首先匹配。通过设计此路由器,请求即可   只匹配一条或几条路线。结果,也没有   意想不到的匹配,这使它非常适合SEO并改善用户   经验。

Here是一些很好的视频内容,可以开始使用Go。