web-dev-qa-db-fra.com

Golang Gorilla mux avec http.FileServer retournant 404

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>
`
33
dodgy_coder

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 ...

  1. définir une correspondance d'expression régulière dans votre routeur ou
  2. utilisez la méthode PathPrefix sur votre routeur, comme:

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/")))
)
50
dodgy_coder

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))
1
smile-on