为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
元芳怎么了 2023-07-10 14:23:01
我想做到这一点,以便当有人访问我的 Go HTTP 服务器上的页面时,他们不会看到扩展.html。例如,当他们访问时,https://example.org/test他们会看到 的内容https://example.org/test.html。我的代码:package mainimport (    "net/http")func main() {    fs := http.FileServer(http.Dir("public/"))    http.Handle("/", http.StripPrefix("/", fs))    http.ListenAndServe(":8000", nil)}
查看完整描述

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

}


查看完整回答
反对 回复 2023-07-10
?
沧海一幻觉

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)

})



查看完整回答
反对 回复 2023-07-10
?
翻翻过去那场雪

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

...


查看完整回答
反对 回复 2023-07-10
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信