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
Zuerst habe ich mit Gorilla Mux gespickt, aber nachdem ich das gesehen habe ... machte meinen Tag ..! –