2017-11-24 4 views
0

Ich habe Golafs Standard http.ServeMux für HTTP-Route-Handling verwendet.Golang "301 Moved Permanently" wenn Request-Pfad zusätzlichen Schrägstrich enthält

wrap := func(h func(t *MyStruct, w http.ResponseWriter, r *http.Request)) func(http.ResponseWriter, *http.Request) { 
    return func(w http.ResponseWriter, r *http.Request) { 
     h(t, w, r) 
    } 
} 

// Register handlers with default mux 
httpMux := http.NewServeMux() 
httpMux.HandleFunc("/", wrap(payloadHandler)) 

Angenommen, dieser Server über http://example.com/

Nur sehr wenige Anfragen meines Klienten zugänglich ist der Weg waren http://example.com/api//module (beachten Sie die zusätzlichen Schrägstrich), die als 301 Moved Permanently umgeleitet wird. Erkundung von innen Golang http ServeMux.Handler(r *Request) Funktion, scheint es ist beabsichtigt.

path := cleanPath(r.URL.Path) 
// if there is any change between actual and cleaned path, the request is 301 ed 
if path != r.URL.Path { 
    _, pattern = mux.handler(host, path) 
    url := *r.URL 
    url.Path = path 
    return RedirectHandler(url.String(), StatusMovedPermanently), pattern 
} 

Ich habe in andere ähnliche Problem untersucht.

go-web-server-is-automatically-redirecting-post-requests

Above qn hat Problem mit redundanten / im Register Muster selbst, aber mein Anwendungsfall ist nicht mit Musterregistern (in einigen verschachtelten Pfaden, die Muster registrieren irrelevent ist)

Problem ist, da die Anfragen meines Klienten sind POST, Browserhandle 301 mit neuer GET Anfrage mit genauen Fragenparametern und POSTkörper. Eine Änderung der HTTP-Methode führt jedoch dazu, dass die Anforderung fehlschlägt.

Ich habe bereits Client angewiesen, die redundante / in URL zu beheben, aber der Fix kann einige (?) Wochen dauern, um in allen Client-Standorten bereitgestellt werden.

Auch diese redundanten / werden in Apache Tomcat behandelt, aber nur in Golang-Server fehlschlägt. Also ist das das beabsichtigte Verhalten in meinem Anwendungsfall (redundanter / im verschachtelten Pfad) mit Golang oder möglichem Bug?

Ich denke an Weg, um die Handler Funktion von ServeMux zu umgehen, aber es wird nicht sinnvoll sein, da Handler Anrufe intern gemacht werden. Um dieses Verhalten zu deaktivieren, wäre Hilfe hilfreich.

Relevante Links

http-post-method-is-actally-sending-a-get

Antwort

1

Die saubere und Umleitung ist Verhalten bestimmt.

Wickeln Sie den Mux mit einem Handler, der die doppelten Schrägstriche entfernt:

type slashFix struct { 
    mux http.Handler 
} 

func (h *slashFix) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    r.URL.Path = strings.Replace(r.URL.Path, "//", "/", -1) 
    h.mux.ServeHTTP(w, r) 
} 

es wie folgt verwendet:

httpMux := http.NewServeMux() 
httpMux.HandleFunc("/", wrap(payloadHandler)) 
http.ListenAndServe(addr, &fixSlash{httpMux}) 
+0

Zuerst habe ich mit Gorilla Mux gespickt, aber nachdem ich das gesehen habe ... machte meinen Tag ..! –

0

accepeted Antwort löste das Problem

Eine weitere Möglichkeit ist zu verwenden Gorilla mux und Einstellung SkipClean(true). Aber seien Sie sicher über die Nebenwirkungen in seiner doc

SkipClean wissen definiert den Pfad Verhalten für neue Wege zu reinigen. Der Anfangswert ist falsch. Benutzer sollten vorsichtig sein, welche Routen nicht gereinigt werden. Wenn der Routenpfad "/ path // to" lautet, bleibt er mit dem doppelten Schrägstrich erhalten.Dies ist hilfreich, wenn Sie eine Route haben wie:/holen/http://xkcd.com/534/

Wenn falsch, wird der Pfad gereinigt werden, so/holen/http://xkcd.com/534/ werden wird /fetch/http/xkcd.com/534

func (r *Router) SkipClean(value bool) *Router { 
    r.skipClean = value 
    return r 
} 
Verwandte Themen