使用Go语言创建静态文件服务器问题
上篇关于Go模板库应用的文章最后我们留下一个问题,页面模板是通过CDN引用的BootStrap的css,js文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过Nginx服务器的一定知道Nginx天然支持静态资源的访问,那么我们是不是也要借助Nginx才能实现处理静态文件请求呢?其实不是,在最开始的文章我们说过“Go语言不需要依赖任何第三方组件就能构建并启动一个高并发的HTTP服务器。”,这篇文章就让我们了解一下如何用Go语言的net/http库实现处理静态资源请求的问题。
我们先用一个简单的例子学习一下使用net/http如何创建一个静态资源服务器,然后再应用到我们的http_demo项目中。
创建静态资源服务器
我们新建一个main.go存放创建静态资源服务器和监听请求的代码,同时在相同目录下创建assets/css和assets/js目录用于存放上篇文章页面模板使用到的静态文件。
main.go assets/ └──css └──bootstrap.min.css └──js └──bootstrap.min.js
main.go中的代码如下:
packagemain import"net/http" funcmain(){ fs:=http.FileServer(http.Dir("assets/")) http.Handle("/static/",http.StripPrefix("/static/",fs)) http.ListenAndServe(":8080",nil) }
- 首先我们使用http.FileServer创建一个使用给定文件系统的内容响应所有HTTP请求的处理程序。
- http.Handle("/static/",http.StripPrefix("/static/",fs))让文件服务器使用assets目录下的文件响应URL路径以/static/开头的所有HTTP请求。
- assets被设置为文件服务器的文件系统根目录,文件服务器会处理以/static开头的URL的请求,所以我们需要使用http.StripPrefix()把static前缀去掉才能在assets目录中搜索到请求的文件。
运行程序,然后用cURL请求一下css文件,看看有没有奏效。
$gorunmain.go $curl-shttp://localhost:8080/static/css/styles.css /*! *Bootstrapv3.3.7(http://getbootstrap.com) *Copyright2011-2016Twitter,Inc. ......
结合gorillia/mux使用文件服务器
上面的例子中文件服务器的处理程序是注册到net/http库提供的标准的ServeMux(服务复用器)中的,我们http_demo项目为了支持复杂的路由注册使用的是gorillia/mux库提供的服务复用器。两者的工作方式不太一样,所以把文件服务器应用到我们项目里还需要做些调整才能起作用。
首先我们先把assets目录整个拷贝到项目的根目录。
funcRegisterRoutes(r*mux.Router){ //servestaticfilerequest fs:=http.FileServer(http.Dir("assets/")) serveFileHandler:=http.StripPrefix("/static/",fs) r.PathPrefix("/static/").Handler(serveFileHandler) ...... }
- 使用router.PathPrefix("/static")创建一个匹配有/static前缀请求的路由。
- 然后使用route.Handler方法将文件服务器注册成路由对应的处理程序(Handler是*mux.Route上的方法)。
注册好文件服务器后,我们把之前页面模板引用的CDN上的js和css文件换成自己服务器上的文件链接。
...... {{template"nav".}} {{template"content".}}