- Created by 郭强, last modified on Jul 27, 2023
静态文件服务配置
默认情况下,GoFrame Server
关闭了静态文件服务的功能,如果开发者配置了静态文件目录,那么静态文件服务将会自动开启。
静态文件服务涉及到的常用配置方法如下:
// 设置http server参数 - ServerRoot func (s *Server) SetServerRoot(root string) // 添加静态文件搜索目录,必须给定目录的绝对路径 func (s *Server) AddSearchPath(path string) // 设置http server参数 - IndexFiles,默认展示文件,如:index.html, index.htm func (s *Server) SetIndexFiles(index []string) // 是否允许展示访问目录的文件列表 func (s *Server) SetIndexFolder(enabled bool) // 添加URI与静态目录的映射 func (s *Server) AddStaticPath(prefix string, path string) // 静态文件服务总开关:是否开启/关闭静态文件服务 func (s *Server) SetFileServerEnabled(enabled bool) // 设置URI重写规则 func (s *Server) SetRewrite(uri string, rewrite string) // 设置URI重写规则(批量) func (s *Server) SetRewriteMap(rewrites map[string]string)
简要介绍:
IndexFiles
为当访问目录时默认检索的文件名称列表(按照slice先后顺序进行检索),当检索的文件存在时则返回文件内容,否则展示目录列表(SetIndexFolder
为true
时),默认的IndexFiles
为:index.html, index.htm
;SetIndexFolder
为设置是否在用户访问文件目录,且没有在目录下检索到IndexFiles
时,则展示目录下的文件列表,默认为关闭;SetServerRoot
为设置默认提供服务的静态文件目录,该目录会被自动添加到SearchPath
中的第一个搜索路径;AddSearchPath
为添加静态文件检索目录,可以有多个,按照文件目录添加的先后顺序执行优先级检索;AddStaticPath
为添加URI
与目录路径的映射关系,可以自定义静态文件目录的访问URI规则;SetRewrite
/SetRewriteMap
为重写规则设置(类似于nginx
的rewrite
),严格上来讲不仅仅是静态文件服务,当然也支持动态的路由注册的rewrite
;
设置静态文件服务的目录路径时,可以使用绝对路径,也可以使用相对路径,例如设置当前运行目录提供静态文件服务可以使用SetServerRoot(".")
。
开发者可以设置多个文件目录来提供静态文件服务,并且可以设置目录及URI的优先级,但是一旦通过SetFileServerEnabled
关闭了静态服务,所有静态文件/目录的访问都将失效。
示例1, 基本使用
package main import "github.com/gogf/gf/v2/frame/g" // 静态文件服务器基本使用 func main() { s := g.Server() s.SetIndexFolder(true) s.SetServerRoot("/Users/john/Temp") s.AddSearchPath("/Users/john/Documents") s.SetPort(8199) s.Run() }
示例2,静态目录映射
package main import "github.com/gogf/gf/v2/frame/g" // 静态文件服务器,支持自定义静态目录映射 func main() { s := g.Server() s.SetIndexFolder(true) s.SetServerRoot("/Users/john/Temp") s.AddSearchPath("/Users/john/Documents") s.AddStaticPath("/my-doc", "/Users/john/Documents") s.SetPort(8199) s.Run() }
示例3,静态目录映射,优先级控制
静态目录映射的优先级按照绑定的URI
精准度进行控制,绑定的URI越精准(深度优先匹配),那么优先级越高。
package main import "github.com/gogf/gf/v2/frame/g" // 静态文件服务器,支持自定义静态目录映射 func main() { s := g.Server() s.SetIndexFolder(true) s.SetServerRoot("/Users/john/Temp") s.AddSearchPath("/Users/john/Documents") s.AddStaticPath("/my-doc", "/Users/john/Documents") s.AddStaticPath("/my-doc/test", "/Users/john/Temp") s.SetPort(8199) s.Run() }
其中,访问/my-doc/test
的优先级会比/my-doc
高,因此假如/Users/john/Documents
目录下存在test
目录(与自定义的/my-doc/test
冲突),将会无法被访问到。
示例4,URI
重写
GoFrame
框架的静态文件服务支持将任意的URI
重写,替换为制定的URI
,使用SetRewrite/SetRewriteMap
方法。
示例,在/Users/john/Temp
目录下只有两个文件test1.html
及test2.html
。
package main import "github.com/gogf/gf/v2/frame/g" func main() { s := g.Server() s.SetServerRoot("/Users/john/Temp") s.SetRewrite("/test.html", "/test1.html") s.SetRewriteMap(g.MapStrStr{ "/my-test1": "/test1.html", "/my-test2": "/test2.html", }) s.SetPort(8199) s.Run() }
执行后,
- 当我们访问
/test.html
,其实最终被重写到了test1.html
,返回的是该文件内容; - 当我们访问
/my-test1
,其实最终被重写到了test1.html
,返回的是该文件内容; - 当我们访问
/my-test2
,其实最终被重写到了test2.html
,返回的是该文件内容;
示例5,跨域
package main import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/glog" ) func beforeServeHook(r *ghttp.Request) { glog.Debugf(r.GetCtx(), "beforeServeHook [is file:%v] URI:%s", r.IsFileRequest(), r.RequestURI) r.Response.CORSDefault() } // 利用hook注入跨域配置 func main() { s := g.Server() s.BindHookHandler("/*", ghttp.HookBeforeServe, beforeServeHook) s.SetServerRoot(".") s.SetFileServerEnabled(true) s.SetAddr(":8080") s.Run() }
Content Menu
- No labels
14 Comments
harry
静态文件如何设置缓存策略(Cache-Control:xxxx)?
比如js文件,想缓存1个月,css文件缓存3个月等?
海亮
目前好像没有相关的细化功能,可以自己实现一下。
具体参考一些网络文章
https://www.cnblogs.com/kevingrace/p/10459429.html
皛心
实际上应该使用配置文件的方式更多。
我经过一番折腾,以下方式编辑配置文件也可以使静态文件生效:
流云
静态文件目录返回的文件MIME type 好像有问题,我将一个包含javascript的目录作为静态文件目录,在前端程序里会有一些importScript这种的用法,如果javascript的MIME type是 text/plain 的话就会报错。这种情况有什么其他方法可以修改或者配置吗?
郭强
Golang
标准库的MIME
自动检测不是很好,你可以自定义一个HOOK
来实现自顶替返回的Content-Type
,具体请参考 HOOK事件回调 章节。墨尘
增加hook事件后,会出现其他问题:Uncaught SyntaxError: Unexpected token '<' (at App.vue:1:1)。搜了springboot相关文章,说跟后台指向到index.html有关。有解决方法吗?
刘欣
添加一个Hook
张永
docker 下面访问不到,不知道少了什么 。非docker 下可以。
jiftle
断点续传是否支持
补充:
静态文件服务,gf框架是支持的。
糖水不加糖
这个需要自行实现.计算length分片再合并就好.
luoxj007
有bug,访问静态文件
request.Response.WriteHeader(http.StatusOK) 执行了两次。 报错了
ymk
请问一下,如果想用 go:embed特性,结合这个静态文件服务,该如何使用
kejj
多个域名绑定,可以分别 SetServerRoot()吗?
阔空晴云
静态文件服务不支持中间件?
我注册的中间件对静态文件的请求没有任何作用呢?