覆盖Go的默认HTTP Server重定向行为

时间:2013-06-02 23:34:23

标签: http go

Go的默认HTTP服务器实现合并HTTP请求中的斜杠,将HTTP重定向响应返回到“已清理”的路径:

https://code.google.com/p/go/source/browse/src/pkg/net/http/server.go#1420

因此,如果您发出HTTP请求GET /http://foo.com/,服务器将以301 Moved Permanently ... Location: /http:/foo.com/回复。

我想禁用此行为并自行处理所有路径。

我是Go新手,似乎我可以创建自己的Server实例并覆盖Handler属性,但我不知道该怎么做?

1 个答案:

答案 0 :(得分:9)

  

我想禁用此行为并自行处理所有路径。

     

我是Go新手,似乎我可以创建自己的Server实例并覆盖Handler属性,但我不确定如何操作?

不要通过http.DefaultServeMuxhttp.Handle方法使用http.HandleFunc注册处理程序,而只需调用:

http.ListenAndServe(":8080", MyHandler)

其中MyHandler是实现http.Handler接口的类型的实例。

反过来,

http.ListenAndServe只是一种执行以下操作的简便方法:

func ListenAndServe(addr string, handler http.Handler) error {
    server := &http.Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

所以你也可以直接这样做。

在你的处理程序中,你可以解析/路由你想要的URI:

func (h *MyHandlerType) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    uri := r.URL.Path
    // ...use uri...
}