一尘不染

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

go

我要这样做,以便当有人访问我的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)
}

阅读 243

收藏
2020-07-02

共1个答案

一尘不染

一种选择是实现http.FileSystem使用http.Dir。这种方法的优点是它利用了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
}
2020-07-02