-
冉冉说
一种选择是使用http.Dir实现http.FileSystem。这种方法的优点是它利用了 http.FileServer 中精心编写的代码。它看起来像这样:type HTMLDir struct { d http.Dir}func main() { fs := http.FileServer(HTMLDir{http.Dir("public/")}) http.Handle("/", http.StripPrefix("/", fs)) http.ListenAndServe(":8000", nil)}Open方法的实现取决于应用程序的需求。如果您总是想附加 .html 扩展名,请使用以下代码:func (d HTMLDir) Open(name string) (http.File, error) { return d.d.Open(name + ".html")}如果您想回退到 .html 扩展名,请使用以下代码:func (d HTMLDir) Open(name string) (http.File, error) { // Try name as supplied f, err := d.d.Open(name) if os.IsNotExist(err) { // Not found, try with .html if f, err := d.d.Open(name + ".html"); err == nil { return f, nil } } return f, err}将前一个翻转过来,以 .html 扩展名开始,然后回退到所提供的名称:func (d HTMLDir) Open(name string) (http.File, error) { // Try name with added extension f, err := d.d.Open(name + ".html") if os.IsNotExist(err) { // Not found, try again with name as supplied. if f, err := d.d.Open(name); err == nil { return f, nil } } return f, err}
-
沧海一幻觉
因此,基本上您需要该http.FileServer功能,但不希望客户端必须输入尾随.html扩展名。另一个简单的解决方案是在服务器端自行添加。可以这样做:fs := http.FileServer(http.Dir("public"))http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r.URL.Path += ".html" fs.ServeHTTP(w, r)})panic(http.ListenAndServe(":8000", nil))就这样。如果您希望此文件服务器还提供其他文件(例如图像和 CSS 文件),则仅.html在没有扩展名的情况下附加扩展名:http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if ext := path.Ext(r.URL.Path); ext == "" { r.URL.Path += ".html" } fs.ServeHTTP(w, r)})
-
翻翻过去那场雪
这是可能的,但不能通过使用http.FileServer().相反,为该/路由创建一个自定义处理程序。在处理程序内部,使用 直接提供请求的文件http.ServeFile()。viewPath := "public/"http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // hack, if requested url is / then point towards /index if r.URL.Path == "/" { r.URL.Path = "/index" } requestedPath := strings.TrimLeft(filepath.Clean(r.URL.Path), "/") filename := fmt.Sprintf("%s/%s.html", viewPath, requestedPath) http.ServeFile(w, r, filename)}))http.ListenAndServe(":8000", nil)该.html后缀被添加到每个请求路径中,因此它将正确指向 html 文件。path / -> ./public/index.htmlpath /index -> ./public/index.htmlpath /some/folder/about -> ./public/some/folder/about.html...