3 回答
TA贡献1877条经验 获得超1个赞
一种选择是使用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
}
TA贡献1824条经验 获得超5个赞
因此,基本上您需要该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)
})
TA贡献2065条经验 获得超13个赞
这是可能的,但不能通过使用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.html
path /index -> ./public/index.html
path /some/folder/about -> ./public/some/folder/about.html
...
- 3 回答
- 0 关注
- 142 浏览
添加回答
举报