negroni golang example go gorilla

example - Golang Gorilla mux con http.FileServer devolviendo 404



gorilla mux example (2)

El problema que estoy viendo es que estoy intentando usar el http.FileServer con la función Gorilla mux Router.Handle.

Esto no funciona (la imagen devuelve un 404) ..

myRouter := mux.NewRouter() myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

esto funciona (la imagen se muestra bien) ..

http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))

Sencillo programa de servidor web a continuación, mostrando el problema ...

package main import ( "fmt" "net/http" "io" "log" "github.com/gorilla/mux" ) const ( HomeFolder = "/root/test/" ) func HomeHandler(w http.ResponseWriter, req *http.Request) { io.WriteString(w, htmlContents) } func main() { myRouter := mux.NewRouter() myRouter.HandleFunc("/", HomeHandler) // // The next line, the image route handler results in // the test.png image returning a 404. // myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/")))) // myRouter.Host("mydomain.com") http.Handle("/", myRouter) // This method of setting the image route handler works fine. // test.png is shown ok. http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/")))) // HTTP - port 80 err := http.ListenAndServe(":80", nil) if err != nil { log.Fatal("ListenAndServe: ", err) fmt.Printf("ListenAndServe:%s/n", err.Error()) } } const htmlContents = `<!DOCTYPE HTML> <html lang="en"> <head> <title>Test page</title> <meta charset = "UTF-8" /> </head> <body> <p align="center"> <img src="/images/test.png" height="640" width="480"> </p> </body> </html> `


A partir de mayo de 2015, el paquete gorilla/mux todavía no tiene versiones de versión. Pero el problema es diferente ahora. No es que myRouter.Handle no coincida con la url y necesita la myRouter.Handle , ¡lo hace! Pero http.FileServer requiere que el prefijo sea eliminado de la url. El siguiente ejemplo funciona bien.

ui := http.FileServer(http.Dir("ui")) myRouter.Handle("/ui/", http.StripPrefix("/ui/", ui))

Tenga en cuenta que no hay / ui / {rest} en un ejemplo anterior. También puede envolver http.FileServer en logger gorilla / handler y ver la solicitud de llegar a FileServer y la respuesta 404 que se http.FileServer .

ui := handlers.CombinedLoggingHandler(os.Stderr,http.FileServer(http.Dir("ui")) myRouter.Handle("/ui/", ui) // getting 404 // works with strip: myRouter.Handle("/ui/", http.StripPrefix("/ui/", ui))


Publiqué esto en el grupo de discusión de golang-nuts y obtuve esta solución de Toni Cárdenas ...

El net / http ServeMux estándar (que es el controlador estándar que está utilizando cuando usa http.Handle ) y el mux Router tienen diferentes formas de hacer coincidir una dirección.

Vea las diferencias entre http://golang.org/pkg/net/http/#ServeMux y http://godoc.org/github.com/gorilla/mux .

Básicamente, http.Handle(''/images/'', ...) coincide con ''/ images / whatever'', mientras que myRouter.Handle(''/images/'', ...) solo coincide con ''/ images /'', y si quieres manejar ''/ imagenes / lo que sea'', tienes que ...

  1. establecer una coincidencia de expresión regular en su enrutador o
  2. use el método PathPrefix en su enrutador, como:

Ejemplos de código

1.

myRouter.Handle(''/images/{rest}'', http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))) )

2.

myRouter.PathPrefix("/images/").Handler( http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))) )