Le problème que je vois est que j'essaie d'utiliser le http.FileServer
avec la fonction Gorilla mux Router.Handle.
Cela ne fonctionne pas (l'image renvoie un 404) ..
myRouter := mux.NewRouter()
myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
cela fonctionne (l'image est montrée ok) ..
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
Programme de serveur Web simple ci-dessous, montrant le problème ...
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>
`
J'ai posté ceci sur le groupe de discussion golang-nuts et j'ai obtenu cette solution de Toni Cárdenas ...
Le standard/http ServeMux standard (qui est le gestionnaire standard que vous utilisez lorsque vous utilisez http.Handle
) Et le routeur mux ont différentes manières de faire correspondre une adresse.
Voir les différences entre http://golang.org/pkg/net/http/#ServeMux et http://godoc.org/github.com/gorilla/mux .
Donc, fondamentalement, http.Handle('/images/', ...)
correspond à '/ images/que ce soit', tandis que myRouter.Handle('/images/', ...)
seulement correspond à '/ images/', et si vous voulez gérer'/images/que ce soit ', vous devez ...
Exemples de code
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/")))
)
En date de mai 2015 gorilla/mux le paquet n'a toujours pas de version. Mais le problème est différent maintenant. Ce n'est pas que myRouter.Handle
ne correspond pas à l'url et a besoin d'une expression régulière, c'est le cas! Mais http.FileServer
nécessite la suppression du préfixe de l'URL. L'exemple ci-dessous fonctionne bien.
ui := http.FileServer(http.Dir("ui"))
myRouter.Handle("/ui/", http.StripPrefix("/ui/", ui))
Remarque, il n'y a pas/ui/ {reste} dans l'exemple abowe. Vous pouvez également envelopper http.FileServer
dans gorilla/handler de l'enregistreur et voir la demande de venir au FileServer et la réponse 404 qui sort.
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))