我看到的问题是我正在尝试http.FileServer将Gorilla mux Router.Handle函数与一起使用。
http.FileServer
这不起作用(图像返回404)。
myRouter := mux.NewRouter() myRouter.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
这有效(图像显示正常)。
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
下面简单的转到Web服务器程序,显示问题…
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> `
我将其发布在golang-nuts讨论组上,并 从 ToniCárdenas获得了此解决方案 …
标准的net / http ServeMux(这是您在使用时使用的标准处理程序http.Handle)和多路复用器路由器具有不同的地址匹配方式。
http.Handle
查看http://golang.org/pkg/net/http/#ServeMux和http://godoc.org/github.com/gorilla/mux之间的区别。
因此,基本上,http.Handle('/images/', ...)匹配“ / images / whatever”,而myRouter.Handle('/images/', ...) 仅 匹配“ / images /”,如果要处理“ / images / whatever”,则必须…
http.Handle('/images/', ...)
myRouter.Handle('/images/', ...)
选项1- 在路由器中使用正则表达式匹配
myRouter.Handle("/images/{rest}", http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))
选项2- 在路由器上使用PathPrefix方法:
myRouter.PathPrefix("/images/").Handler(http.StripPrefix("/images/", http.FileServer(http.Dir(HomeFolder + "images/"))))