如何使用Go网络服务器提供index.html(或其他静电HTML文件)?

我只想要一个基本的,静电的超文本标记语言文件(例如,像一篇文章),我可以从围棋网络服务器上提供.HTML应该可以在Go程序之外修改,就像使用HTML模板时一样.

这是我的网络服务器,它只托管硬编码文本("Hello world!").

package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello world!")
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":3000", nil)
}

推荐答案

使用Golang Net/Http包可以非常轻松地完成这项任务.

您需要做的就是:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir("./static")))
        http.ListenAndServe(":3000", nil)
}

假设静态文件位于项目根目录中名为static的文件夹中.

如果它在文件夹static中,您将有index.html个文件调用http://localhost:3000/,这将导致呈现该索引文件,而不是列出所有可用的文件.

此外,调用该文件夹中的任何其他文件(例如http://localhost:3000/clients.html)将显示该文件,该文件由浏览器正确呈现(至少是Chrome、Firefox和Safari:)

更新:从不同于"/"的url提供文件

如果您想提供文件,比如从url:localhost:3000/static下的文件夹./public提供服务,您必须使用use additional function:func StripPrefix(prefix string, h Handler) Handler,如下所示:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
        http.ListenAndServe(":3000", nil)
}

多亏了这一点,你从./public开始的所有文件都可以在localhost:3000/static以下使用

如果没有http.StripPrefix函数,如果您试图访问文件localhost:3000/static/test.html,服务器将在./public/static/test.html中查找它

这是因为服务器将整个URI视为文件的相对路径.

幸运的是,使用内置函数可以很容易地解决这个问题.

Go相关问答推荐

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

错误&对象已被Golang在K8s操作符上修改

如何在链接中写入链接

将这两个函数合二为一的惯用方法

如何根据中间件的请求设置上下文值?获取 go-staticcheck 问题

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

使用Dockertest进行Golang SQL单元测试的基本设置

按位移计算结果中的差异

如何将已知类型转换为指向switch 中类型参数的指针?

自定义 Fyne 自适应网格布局

具有两个参数的动态规划:天数和优惠券

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

判断不同 go map 类型中的重复键

具有未导出字段的 struct 类型之间的转换

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

go:识别重新定义标志的包

关系不存在 GORM

如何扩充 ResponseWriter 的 Header() 返回的 map

Beego - 我需要context.Context而不是 Beego 上下文