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

jb.*_*jb. 3 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属性,但我不确定如何?

thw*_*hwd 9

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

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

而不是http.DefaultServeMux通过http.Handlehttp.HandleFunc方法注册处理程序只需调用:

http.ListenAndServe(":8080", MyHandler)
Run Code Online (Sandbox Code Playgroud)

where MyHandler是实现http.Handler接口的类型的实例.

http.ListenAndServe 反过来只是一个执行以下操作的简便方法:

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

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

在您的处理程序中,您可以解析/路由URI,但是您希望这样:

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