如何使用Go Web服务器提供静态html文件?

如何使用Go Web服务器为index.html(或其他静态HTML文件)提供服务?

我只想要一个基本的,静态的HTML文件(例如文章),我可以从一个去web服务器。 HTML应该可以在go程序之外修改,就像在使用HTML模板时一样。

这是我的networking服务器,只承载硬编码的文本(“你好,世界!”)。

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 )将显示该文件,由浏览器正确呈现(至lessChrome,Firefox和Safari :))

更新:从不同于“/”的URL提供文件

如果你想提供文件,从文件夹./public在url下: localhost:3000/static你必须使用附加函数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作为文件的相对path。

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

不是一个FTP服务器:这是不同于我的意图,这将是服务的index.html主页,就像一个普通的Web服务器会。 比如,当我在浏览器中访问mydomain.com时,我想要index.html呈现。

这主要是“ 编写Web应用程序 ”所描述的,以及像hugo (静态HTML网站生成器)这样的项目。

这是关于阅读一个文件,并用ContentType“text / html”来回应:

 func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := server.renderFile(w, r.URL.Path) if err != nil { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(http.StatusNotFound) server.fn404(w, r) } } 

renderFile()基本上阅读和设置正确的types:

  file, err = ioutil.ReadFile(server.MediaPath + filename) if ext != "" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) }