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 Comentarios

  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

Dejar respuesta

Please enter your comment!
Please enter your name here