Golang Gorila mux con http.FileServer regresar 404

El problema que estoy viendo es que estoy tratando de utilizar el http.FileServer con el Gorila mux Router.Identificador de la función.

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

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

esto funciona (la imagen se muestra ok)..

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

Simple ir a 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>
`
InformationsquelleAutor dodgy_coder | 2014-01-20

2 Kommentare

  1. 50

    He publicado esto en golang-tuercas grupo de discusión y consiguió esta solución de Toni Cárdenas

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

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

    Así que, básicamente, http.Handle('/images/', ...) partidos ‘/images/lo que sea», mientras que myRouter.Handle('/images/', ...) sólo partidos ‘/images/’, y si quieres manejar ‘/images/lo que sea’, usted tiene que …

    1. establecer una concordancia de expresiones regulares en el router o en
    2. utilizar el PathPrefix método en el router, 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/")))
    )
    • +1 #2 ha sido un éxito para mí en un proyecto actual (antes de que me topé con esta respuesta. sólo tranquilizar al lector(s) que el #2 es lo que estoy usando y funciona).
    • +1 – #2 también funciona para mí
    • Sólo una nota para agregar, por favor recuerde que si usted es un golang newb como yo, golang no como afirmaciones como las de formato en el #2. Necesitaba combinar todas las tres líneas en una sola línea (no hay cambios en la sintaxis, sólo los cambios en los espacios en blanco) antes de golang iba a dejar de quejarse acerca de esperar comas. #2 es la respuesta correcta, solo es formado de tal manera que va a causar problemas para los novatos y principiantes como yo.
    • Tienes razón, tuve que poner el de hacer la declaración de una sola línea.
    • Muchas gracias por ponerme fuera de las horas de la miseria, la PathPrefix y StripPrefix cosa que funcionó para mí, me fui de r.Handle("/", fs) a un r.PathPrefix("/").Handler(http.StripPrefix("/", fs))
  2. 1

    A partir de Mayo de 2015 gorila/mux paquete todavía no tiene versión. Pero el problema es diferente ahora. No es que myRouter.Handle no coincide con la url y necesidades regexp, sí! Pero http.FileServer requiere prefijo para ser removido de la dirección url. Siguiente ejemplo funciona bien.

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

    Nota, no es /interfaz de usuario/{resto} en abowe ejemplo. También puede envolver http.FileServer en el registrador de gorila/controlador y ver solicitud de venir a FileServer y la respuesta 404 salir.

    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))
    • El valor predeterminado Handle método de router todavía crea un route de la misma manera como antes. He probado el método que se indicó anteriormente y "/ui/" no coincidirá con todas las rutas con la "/ui/" prefijo. @dodgy_coder la solución es correcta. Incluir la expresión regular con el defecto de Handler método o uso PathPrefix

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea