英文:
Golang web server not serving static files
问题
我相当确定我忽视了一些明显的东西,但我不确定是什么。我正在构建一个简单的网络应用程序,用于提供书籍的模板页面。模板本身工作正常,图像路径似乎正确,但是图像本身却一直显示404错误。
以下是模板的代码:
<h1>{{.Title}}</h1>
<h2>{{.Author.Name}}</h2>
<image src="../images/{{.ImageURI}}" />
以下是应用程序的代码:
package main
import (
"html/template"
"log"
"net/http"
"time"
"github.com/gorilla/mux"
"github.com/user/marketplace/typelibrary"
)
var books []typelibrary.Book
func ItemHandler(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
var selected typelibrary.Book
//Retrieve item data
for _, item := range books {
if item.ID == params["id"] {
selected = item
break
}
}
t, _ := template.ParseFiles("./templates/book.html")
t.Execute(w, selected)
}
func main() {
router := mux.NewRouter()
books = append(books, typelibrary.Book{ID: "1", Title: "The Fellowship of the Ring", ImageURI: "LotR-FotR.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "2", Title: "The Two Towers", ImageURI: "LotR-tTT.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "3", Title: "The Return of the King", ImageURI: "LotR-RotK.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "4", Title: "Monster Hunter International", ImageURI: "MHI1.jpg", Author: &typelibrary.Author{Name: "Larry Correia"}})
router.Handle("/", http.FileServer(http.Dir(".")))
router.Handle("/images/", http.FileServer(http.Dir("../images/")))
router.HandleFunc("/item/{id}", ItemHandler).Methods("GET")
srv := &http.Server{
Handler: router,
Addr: ":8080",
WriteTimeout: 10 * time.Second,
ReadTimeout: 10 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
图像存储在images
子目录中,直接位于可执行文件所在的目录下。当我尝试在页面中查看损坏的图像时,路径显示为localhost:8080/images/[imagename]
,但是却显示404错误。我在这里缺少了哪些配置或路由选项?
英文:
I'm fairly certain that I've overlooked something obvious, but I'm not sure what. I'm building a simple web application that serves up templated pages of books. The template works fine, and the path for the image seems to be populating correctly, but I keep getting a 404 error for the image itself.
Here is the template:
<!-- language: html -->
<h1>{{.Title}}</h1>
<h2>{{.Author.Name}}</h2>
<image src="../images/{{.ImageURI}}" />
and here is the application itself:
<!-- language: go -->
package main
import (
"html/template"
"log"
"net/http"
"time"
"github.com/gorilla/mux"
"github.com/user/marketplace/typelibrary"
)
var books []typelibrary.Book
func ItemHandler(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
var selected typelibrary.Book
//Retrieve item data
for _, item := range books {
if item.ID == params["id"] {
selected = item
break
}
}
t, _ := template.ParseFiles("./templates/book.html")
t.Execute(w, selected)
}
func main() {
router := mux.NewRouter()
books = append(books, typelibrary.Book{ID: "1", Title: "The Fellowship of the Ring", ImageURI: "LotR-FotR.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "2", Title: "The Two Towers", ImageURI: "LotR-tTT.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "3", Title: "The Return of the King", ImageURI: "LotR-RotK.jpg", Author: &typelibrary.Author{Name: "JRR Tolkien"}})
books = append(books, typelibrary.Book{ID: "4", Title: "Monster Hunter International", ImageURI: "MHI1.jpg", Author: &typelibrary.Author{Name: "Larry Correia"}})
router.Handle("/", http.FileServer(http.Dir(".")))
router.Handle("/images/", http.FileServer(http.Dir("../images/")))
router.HandleFunc("/item/{id}", ItemHandler).Methods("GET")
srv := &http.Server{
Handler: router,
Addr: ":8080",
WriteTimeout: 10 * time.Second,
ReadTimeout: 10 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
The images are stored in the images
subdirectory, directly below the directory where the executable is. When I attempt to view the broken image in the page, the path shows up as localhost:8080/images/[imagename]
but gives a 404 error. What configuration or routing options am I missing here?
答案1
得分: 8
你正在错误地创建你的路由以提供图像。Router.Handle()
方法使用 Path()
匹配器来匹配 URL,该匹配器匹配整个路径,而你实际上想要匹配任何以 "/image/" 开头的路径。相反,你应该使用 PathPrefix()
匹配器创建路由:
var imgServer = http.FileServer(http.Dir("./images/"))
router.PathPrefix("/images/").Handler(http.StripPrefix("/images/", imgServer))
更多信息请参考 https://godoc.org/github.com/gorilla/mux#Router.Handle。
英文:
You are creating your route incorrectly to serve your images. The Router.Handle()
method matches URLs with the Path()
matcher, which matches the entire path, while you actually want to match any path that starts with "/image/". Instead, create the route with the PathPrefix()
matcher:
var imgServer = http.FileServer(http.Dir("./images/"))
router.PathPrefix("/images/").Handler(http.StripPrefix("/images/", imgServer))
See https://godoc.org/github.com/gorilla/mux#Router.Handle for more information.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论