首页
学习
活动
专区
圈层
工具
发布
16 篇文章
1
Go 语言 Web 编程系列(一)—— 快速入门:创建第一个 Web 应用
2
Go 语言 Web 编程系列(二)—— HTTP 请求处理的底层运行机制
3
Go 语言 Web 编程系列(三)—— 基于官方标准库自定义路由处理器
4
Go 语言 Web 编程系列(四)—— 基于 gorilla/mux 包实现路由定义:基本使用篇
5
Go 语言 Web 编程系列(五)—— 基于 gorilla/mux 包实现路由匹配:进阶使用篇
6
Go 语言 Web 编程系列(六)—— 基于 gorilla/mux 包实现路由匹配:路由中间件
7
Go 语言 Web 编程系列(七)—— 基于 gorilla/mux 包实现路由匹配:处理静态资源响应
8
Go 语言 Web 编程系列(八)—— 基于 gorilla/mux 包实现路由匹配:服务 SPA 应用
9
Go 语言 Web 编程系列(九)—— 基于 gorilla/mux 包实现路由匹配:通过 CORS 处理跨域请求
10
Go 语言 Web 编程系列(十)—— 基于 gorilla/mux 包实现路由匹配:健康检查与接口测试
11
Go 语言 Web 编程系列(十一)—— 仿照 Laravel 框架对 Go 路由代码进行拆分
12
Go 语言 Web 编程系列(十二)—— 通过 Request 读取 HTTP 请求报文
13
Go 语言 Web 编程系列(十三)—— 获取用户请求数据(上)
14
Go 语言 Web 编程系列(十四)—— 获取用户请求数据(下)
15
Go 语言 Web 编程系列(十五)—— 通过 ResponseWriter 接口创建 HTTP 响应
16
Go 语言 Web 编程系列(十六)—— 设置、读取和删除 Cookie

Go 语言 Web 编程系列(七)—— 基于 gorilla/mux 包实现路由匹配:处理静态资源响应

到目前为止,我们都是在处理动态资源,也就是 Go 代码实现的响应。HTTP 服务器除了处理动态资源之外,还应该具备处理静态资源的能力,比如 HTML、CSS、JavaScript、图片都属于静态资源的范畴。

要处理静态资源,需要借助 PathPrefix() 方法指定静态资源所在的路径前缀,然后在请求处理器中通过 http.FileServer 直接返回文件内容本身作为响应:

代码语言:javascript
复制
func main()  {
    r := mux.NewRouter()
    r.Use(loggingMiddleware)

    // 解析服务器启动参数 dir 作为静态资源 Web 根目录
    // 默认是当前目录 .
    var dir string
    flag.StringVar(&dir, "dir", ".", "静态资源所在目录,默认为当前目录")
    flag.Parse()

    // 处理形如 http://localhost:8000/static/<filename> 的静态资源路由
    r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(dir))))    
    
    // 其它路由
    ...
    
    log.Fatal(http.ListenAndServe(":8080", r))
}

以上述代码为例,当我们请求 http://localhost:8080/static/app.js 文件时,会到 static 目录下查找 app.js,如果找不到会返回 404,否则返回文件本身作为响应。

我们试着在上述入口文件所在目录下创建 static/app.js,并初始化代码如下:

代码语言:javascript
复制
document.write("hello from javascript");

然后在 static 目录下放置一张图片 test.jpg 文件,启动这个 HTTP 服务器:

代码语言:javascript
复制
go run mux.go -dir=static

注意这里我们通过 dir 参数指定了静态资源的根目录为 static,如果不指定的话访问上述静态资源会报 404。

接下来,就可以在浏览器中访问服务器 static 目录下的静态资源了:

虽然 gorilla/mux 路由器提供了对静态资源的支持,但是通常我们还是会和 PHP 一样,基于 Nginx 来处理静态资源,然后将动态请求转发给 Go HTTP 服务器,因为 Nginx 作为一款强大的反向代理服务器,并发处理静态资源的能力非常强悍,没必要自己去处理这块逻辑。

下一篇
举报
领券