Http 从URL中删除尾部斜杠-转到静态服务器

Http 从URL中删除尾部斜杠-转到静态服务器,http,go,server,go-http,go-server,Http,Go,Server,Go Http,Go Server,我用http.FileServer设置了一个简单的Go静态文件服务器。如果我有一个类似于public>about>index.html的目录结构,服务器将正确地将/about解析为about>index.html,但它会添加一个尾随斜杠,因此url变成/about/ 使用http.FileServer时,是否有一种简单的方法可以删除这些尾部斜杠?归根结底,这两种方式都是可行的——如果可能的话,这主要是个人偏好,不使用尾随斜杠。当您注册路由/about/时,添加了/about的隐式路由(它将客户端

我用
http.FileServer
设置了一个简单的Go静态文件服务器。如果我有一个类似于
public>about>index.html
的目录结构,服务器将正确地将
/about
解析为
about>index.html
,但它会添加一个尾随斜杠,因此url变成
/about/


使用
http.FileServer
时,是否有一种简单的方法可以删除这些尾部斜杠?归根结底,这两种方式都是可行的——如果可能的话,这主要是个人偏好,不使用尾随斜杠。

当您注册路由
/about/
时,添加了
/about
的隐式路由(它将客户端重定向到
/about/

要解决此问题,可以注册两个显式路由:

  • /about
    提供您的
    index.html
  • /about/
    http.FileServer
    提供服务,以处理页面的任何HTML资产
像这样:

// what you had before
h.Handle("/about/",
    http.StripPrefix(
        "/about/",
        http.FileServer(http.Dir("/tmp/about-files")),
    ),
)

// prevents implicit redirect to `/about/`
h.HandleFunc("/about",
    func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, "index.html") // serves a single file from this route
    },
)

这不是个人喜好。以
/
结尾的URL路径名告诉服务器,客户端需要一个表示该路径上可用资源列表的表示形式,而不以
/
结尾的路径名则要求服务器发送该路径上特定实体的表示形式。(,引用相关资料。)@kostix对某些人来说可能是一种约定,但它肯定不在任何HTTP标准文档中幸运的是,这是一种罕见的情况,Go对某些事情武断地固执己见,并将这种观点硬编码到stdlib中。使用
http.FileServer
@Adrian时无法“修复”它。实际上,您可以通过注册两个显式路由来解决此问题。