如何使用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)) }