我要这样做,以便当有人访问我的Go HTTP服务器上的页面时,他们不会看到该.html扩展名。例如,当他们访问时,https://example.org/test他们会看到的内容https://example.org/test.html。
.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) }
一种选择是实现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 }