2013-06-02 63 views
2

Go的默認HTTP服務器實現合併斜槓的HTTP請求,返回一個HTTP重定向迴應「清理」路徑:重寫Go的默認HTTP Sever的重定向行爲

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屬性,但我不知道該怎麼做?

回答

7

我想禁用這種行爲並自己處理所有路徑。

我是一個Go新手,看起來好像我可以創建自己的服務器實例並覆蓋Handler屬性,但我不知道該怎麼做?

相反通過http.Handlehttp.HandleFunc方法註冊到http.DefaultServeMux處理程序只需要調用的:

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... 
} 
+0

哇,這竟然是真的很簡單 - 我會花更多的時間在接口和類型讀了!以下是我結束的實施:https://gist.github.com/johnboxall/5698940 –

+0

@jb。你不需要空的struct,關閉會執行https://gist.github.com/tsenart/5fc18c659814c078378d –