从简单 HTTP 服务器中的每个文件中删除 .html 扩展名

我想做到这一点,以便当有人访问我的 Go HTTP 服务器上的页面时,他们不会看到扩展.html。例如,当他们访问时,https://example.org/test他们会看到 的内容https://example.org/test.html。


我的代码:


package main


import (

    "net/http"

)


func main() {

    fs := http.FileServer(http.Dir("public/"))


    http.Handle("/", http.StripPrefix("/", fs))

    http.ListenAndServe(":8000", nil)

}


元芳怎么了
浏览 143回答 3
3回答

冉冉说

一种选择是使用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...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go