当前位置: 首页 > 编程笔记 >

使用Go语言创建静态文件服务器问题

尉迟栋
2023-03-14
本文向大家介绍使用Go语言创建静态文件服务器问题,包括了使用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 中的代码如下:

package main

import "net/http"

func main() {
 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 文件,看看有没有奏效。

$ go run main.go

$ curl -s http://localhost:8080/static/css/styles.css

/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 ......

结合 gorillia/mux 使用文件服务器

上面的例子中文件服务器的处理程序是注册到 net/http 库提供的标准的 ServeMux (服务复用器)中的,我们 http_demo 项目为了支持复杂的路由注册使用的是 gorillia/mux 库提供的服务复用器。两者的工作方式不太一样,所以把文件服务器应用到我们项目里还需要做些调整才能起作用。

首先我们先把 assets 目录整个拷贝到项目的根目录。

func RegisterRoutes(r *mux.Router) {
 // serve static file request
 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 文件换成自己服务器上的文件链接。

<html lang="en">
<head>
 ......
 <link href="/static/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">
</head>

<body>

{{ template "nav" .}}

<div class="container">
 {{template "content" .}}
</div> <!-- /container -->

<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>

然后重启服务器,访问之前的页面 http:localhost:/view/index  ,验证一下我们的服务器现在是否能伺服静态文件的请求了。

页面样式正常,现在只要在服务器这个 assets 目录下的文件,我们都可以通过 http://localhost:8000/static/* 路径的 URL 访问到。

总结

到此这篇关于使用Go语言创建静态文件服务器的文章就介绍到这了,更多相关go 静态文件服务器内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍Go语言使用HTTP包创建WEB服务器的方法,包括了Go语言使用HTTP包创建WEB服务器的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言使用HTTP包创建WEB服务器的方法。分享给大家供大家参考,具体如下: 在Golang中写一个http web服务器大致是有两种方法: 1 使用net包的net.Listen来对端口进行监听 2 使用net/http包 这里是

  • 问题内容: 如何使用Go Web服务器提供index.html(或其他静态HTML文件)? 我只想要一个基本的静态HTML文件(例如,一篇文章),就可以从Go Web服务器上提供该文件。HTML应该可以在go程序之外进行修改,就像使用HTML模板时一样。 这是我的Web服务器,仅托管硬编码文本(“ Hello world!”)。 问题答案: 使用Golang net / http包,该任务非常容易

  • 本文向大家介绍使用Go语言创建WebSocket服务的实现示例,包括了使用Go语言创建WebSocket服务的实现示例的使用技巧和注意事项,需要的朋友参考一下 今天介绍如何用 Go 语言创建 WebSocket 服务,文章的前两部分简要介绍了 WebSocket 协议以及用 Go 标准库如何创建 WebSocket 服务。第三部分实践环节我们使用了 gorilla/websocket 库帮助我们快

  • 我们先来看看最简单的本地静态文件服务配置示例: server { listen 80; server_name www.test.com; charset utf-8; root /data/www.test.com; index index.html index.htm; } 就这些?

  • 我用Go语言创建了一个示例gRPC客户端和服务器(使用原型)。我理解Go语言中的并发模型。但是,我正在尝试理解服务器中接受来自同一客户端(客户端上的多个goroutines)/多个客户端的并行请求的并发模型。 更具体地说: 当一个新的gRPC呼叫到来时,服务器是否创建了一个新的goroutine

  • 我试着设置nginx来服务我的node.js应用程序静态文件。问题是,当我试图得到我的文件时,我的状态是403禁止的。 当我尝试下载一个文件从 /root/appJs/public/css/style.css我写http://sitename.com/css/style.css我retive 403禁忌状态。我已经在一些论坛上寻找解决方案,但没有