出于效率等原因,最近将web框架由martini切换为了beego,其他地方都很平顺,只是两个框架的handler签名不一致,需要修改,所以耗时较长,这是预计到的。但是有一个地方没有预计到,也耗费了较多时间,那就是静态文件的服务。

  用过martini的tx都知道,在mairtini中如果我们设置一个目录为静态文件目录,只需添加martini的Static插件,如设置web子目录为应用的静态文件路径:

  1. m.Use(martini.Static("web"))

  此时,如果我们访问一个url,此url并没有在martini中注册,但是如果位于web目录中,就可以得到响应,例如:

  1. http://127.0.0.1:8088/
  2. //返回web目录下的index.html
  3. http://127.0.0.1:8088/ js/jquery.js
  4. //返回web/js/jquery.js

  但是,切换为beego之后,却没有找到这样的功能。发现beego对于静态文件的支持设计的有点不够友好,比如我进行如下设置

  1. beego.SetStaticPath("/web", "web")

  这时候访问结果如下

  1. http://127.0.0.1:8088/
  2. //返回404页面
  3. http://127.0.0.1:8088/web
  4. //返回404页面
  5. http://127.0.0.1:8088/web/index.html
  6. //返回403 (Forbidden)
  7. http://127.0.0.1:8088/web/chat.html
  8. //返回正常
  9. http://127.0.0.1:8088/web/images/test.png
  10. //返回正常

  据此结果,有两点不满意:

  1. 必须添加该staticdir 映射的path访问,设置为“/” 无效
  2. 竟然不能返回默认页面!看文档需要设置”beego.DirectoryIndex=true“ ,不是我需要的!

  因此,我着手自己实现该需求。通过学习beego文档,发现可以设置Filter。于是,编写如下代码:

  1. //main中如下设置filter
    beego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic)
  2. .
    .
    .
  3. func TransparentStatic(ctx *context.Context) {
  4. defInd :=
  5. maxInd := len(defHomes) -
  6. orpath := ctx.Request.URL.Path
  7. beego.Debug(" in trasparentstatic filter orpath", orpath)
  8. if strings.Index(orpath, "api/") >= || strings.Index(orpath, "web/") >= {
  9. return
  10. }
  11. DefaultStartPage:
  12. p := orpath
  13. if strings.EqualFold(p, "/") {
  14. p += defHomes[defInd]
  15. defInd++
  16. }
  17. ps := strings.Split(p, "/")
  18. ps = append([]string{"web"}, ps...)
  19. rp := strings.Join(ps, "/")
  20. fp := fw.MapPath(rp)
  21. beego.Debug("test fp", fp)
  22. if !fileutils.Exists(fp) {
  23. if defInd > && defInd < maxInd {
  24. goto DefaultStartPage
  25. }
  26. return
  27. } else {
  28. beego.Debug("found static ", fp)
  29. http.ServeFile(ctx.ResponseWriter, ctx.Request, fp)
  30. //cannot use Redirect! will lead loop
  31. //http.Redirect(ctx.ResponseWriter, ctx.Request, rp, http.StatusFound)
  32. return
  33. }
  34. //
  35.  
  36. }

  运行之后,发现访问服务地址,带不带末尾的"/",都不能返回默认页面,如果明确访问/index.html可以实现访问。后经探索发现,虽然beego说明中说"/*"可以适配所有url,但是实际上不能适配"/",因此需要在注册一个filter到”/":

  1. beego.InsertFilter("/", beego.BeforeRouter, TransparentStatic) //must has this for default page
  2. beego.InsertFilter("/*", beego.BeforeRouter, TransparentStatic)

至此,一切正常了。

【玩转Golang】beego下实现martini中的透明式静态文件服务(static folder)效果。的更多相关文章

  1. django模版中配置和使用静态文件方法

    1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...

  2. [小技巧]ASP.NET Core中如何预压缩静态文件

    原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...

  3. 当Django中Debug=False,静态文件处理方式。

    Django设置DEBUG为False时,'django.contrib.staticfiles'会关闭,即Django不会自动搜索静态文件,静态文件不能加载导致的问题有两个: 1.页面排版不正常,即 ...

  4. springboot项目中js、css静态文件路径访问

    springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...

  5. Django -&gt; debug模式下的静态文件服务(/media/)

    正式公布django项目的时候,假设存在静态文件(通常会统一放在名称为media或static的文件夹下),则须要建立url到文件系统的映射,比如.使用nginx的时候我们须要进行这种配置. # Dj ...

  6. gin中提供静态文件服务

    package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 静 ...

  7. 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何

    基于 Vue.js 之 iView UI 框架非工程化实践记要   像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引 ...

  8. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  9. NodeJS中的静态资源管理服务

    欢迎大家指导与讨论 : ) 一.什么是静态资源 静态资源就是放在服务器中的特定的文件.比较常见的有.css,.png, .js的这一些后缀的文件.下图中的这个html页面便要获取到logo.png和a ...

随机推荐

  1. 设计模式之装饰模式(iOS开发,代码用Objective-C展示)

    在面向对象编程中有个重要的原则,里氏代换原则:一个软件实体如果使用的是一个父类的话,那么一定适用其子类,而且它察觉不出父类对象与子类对象的区别.也就是说,在软件设计里面,把父类替换成它的子类,程序的行 ...

  2. WebSocket的Cookie问题(转)

    问题:我用Nginx作静态服务器,Node.js监听另外端口作WebSocket服务器,客户端创建实例时,如果origin和host不一样的话,req实例的headers中没有cookie… ###解 ...

  3. 【.Net】Thread.Start()与ThreadPool.QueueUserWorkItem()的区别

    百度搜到的靠前的几篇文章,都是写了两种API的使用实例,但并没有说清两者的具体差别. 直接上stackoverflow搜才是正确的姿势.(想上谷歌,然而十/九_大|期间VPN各种被墙,就很气) 参考: ...

  4. ctags简易用法

    vim + ctags a 首先我们必需给要阅读的原始码建一个或多个tags文件, 在shell下利用ctags命令给单个文件建立tags如下: $ ctags filename.c 要给同一个目录下 ...

  5. (Hive)史上最难解析的json字符串解析出来了!!

    首先说下解析的数据如下: {"username":"king","actionInfo":{"id":1,"a ...

  6. git基本操作:使用git将本地代码上传到GitHub

    一.创建github repository(仓库) 1.登录GitHub 创建GitHub仓库,首先需要登录GitHub,GitHub网址:https://github.com.如果没有GitHub账 ...

  7. DFS-深度优先遍历

    #include <iostream> /* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 4 1 Total: 9 7 5 Min: 5 ...

  8. centos7配置kerberos服务,并使用JAAS登录

    准备两个虚拟机:192.168.1.101.192.168.1.102,101作为kerberos的server端,102作为kerberos的client端.开启88端口. 1.安装kerberos ...

  9. maven工程如何引用css和js文件

    工程目录结构如下图: 目的: 在index.jsp中引用hello.js和base.css文件 实现: 在web.xml中,新增<servlet-mapping>     <serv ...

  10. 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸

    /** * Created by xx on 15-05-28. * 基于html5 canvas 的客户端异步上传画片的插件 * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机weba ...