解决golang http.FileServer 遇到的坑

 更新时间:2020年12月18日 09:56:42   作者:一名路过的小码农  
这篇文章主要介绍了解决golang http.FileServer 遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

上次写了一个2行实现一个静态服务器的文章

今天群里有个哥们是这么写居然返回的是404 见鬼了嘛??

http.handle("/js", http.FileServer(http.Dir("js"))

http.ListenAndServe("8080", nil)

大概的意思就是绑定 路由为 js 的时候访问这个js 文件夹 看了一下确实代码上面没什么毛病。但是路径怎么修改 也不好使。

我把代码拿到我的 电脑上面运行 shitfuck 这是搞什么啊居然出现下面的这个情况

奇怪居然在我电脑上面也不能执行了。莫非我的文件夹权限有问题

给赋值一下 777 权限 重新运行

居然还不好使。来回改路径 就这么捣鼓了两个小时无意中看到一个文章就是说的这个

加一个StripPrefix 方法就好了

那这个玩意是干嘛的呢。看看手册

然后我的代码就变成这个样子

http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))

http.StripPrefix用于过滤request,参数里的handler的request过滤掉特定的前序,只有这样,才能正确显示文件目录。 shitfuck

看一下我的路径 以及下面存放的文件

修改代码完成后就这么神奇般的解决了

浪费了两个小时不过 还不错最起码解决问题了。

补充:Golang1.8标准库http.Fileserver跟http.ServerFile小例子

我就废话不多说了,大家还是直接看代码吧~

package main
import (
  "fmt"
  "net/http"
  "os"
  "path"
  "strings"
)
var staticfs = http.FileServer(http.Dir("D:\\code\\20160902\\src\\"))
func main() {
  //浏览器打开的时候显示的就是D:\\code\\20160902\\src\\client目录下的内容"
  http.Handle("/client/", http.FileServer(http.Dir("D:\\code\\20160902\\src\\")))
  http.HandleFunc("/static/", static)
  http.HandleFunc("/js/", js)
  http.HandleFunc("/", route)
  http.ListenAndServe(":1789", nil)
}
func route(w http.ResponseWriter, r *http.Request) {
  fmt.Println(r.URL)
  fmt.Fprintln(w, "welcome")
  r.Body.Close()
}
//这里可以自行定义安全策略
func static(w http.ResponseWriter, r *http.Request) {
  fmt.Printf("访问静态文件:%s\n", r.URL.Path)
  old := r.URL.Path
  r.URL.Path = strings.Replace(old, "/static", "/client", 1)
  staticfs.ServeHTTP(w, r)
}
//设置单文件访问,不能访问目录
func js(w http.ResponseWriter, r *http.Request) {
  fmt.Printf("不能访问目录:%s\n", r.URL.Path)
  old := r.URL.Path
  name := path.Clean("D:/code/20160902/src" + strings.Replace(old, "/js", "/client", 1))
  info, err := os.Lstat(name)
  if err == nil {
    if !info.IsDir() {
      http.ServeFile(w, r, name)
    } else {
      http.NotFound(w, r)
    }
  } else {
    http.NotFound(w, r)
  }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Go语言sync.Cond使用方法详解

    Go语言sync.Cond使用方法详解

    Go语言标准库中还包含条件变量 sync.Cond,它可以让一组 Goroutine 都在满足特定条件时被唤醒,每一个sync.Cond结构体在初始化时都需要传入一个互斥锁,接下来我们将通过文中例子了解它的使用方法,感兴趣的同学跟着小编一起来看看吧
    2023-07-07
  • Go实现基于RSA加密算法的接口鉴权

    Go实现基于RSA加密算法的接口鉴权

    这篇文章主要介绍了Go实现基于RSA加密算法的接口鉴权,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • go内存缓存BigCache实现BytesQueue源码解读

    go内存缓存BigCache实现BytesQueue源码解读

    这篇文章主要为大家介绍了go内存缓存BigCache实现BytesQueue源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言如何使用分布式锁解决并发问题

    Go语言如何使用分布式锁解决并发问题

    这篇文章主要为大家详细介绍了Go 语言生态中基于 Redis 实现的分布式锁库 redsync,并探讨其使用方法和实现原理,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Go Wails开发桌面应用使用示例探索

    Go Wails开发桌面应用使用示例探索

    这篇文章主要为大家介绍了Go Wails的使用示例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 解决golang gin框架跨域及注解的问题

    解决golang gin框架跨域及注解的问题

    这篇文章主要介绍了解决golang gin框架跨域及注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 入门学习Go的基本语法

    入门学习Go的基本语法

    这篇文章主要介绍了Go语法的基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下,希望能帮助到你
    2021-07-07
  • Go映射的使用

    Go映射的使用

    Go提供了另一个重要的数据类型,称为map,它将唯一键映射到值,本文主要介绍了Go映射的使用,包括声明映射、初始化映射、操作映射等,感兴趣的可以了解一下
    2023-11-11
  • 深入Golang之context的用法详解

    深入Golang之context的用法详解

    本篇文章主要介绍了深入Golang之context的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Go利用反射reflect实现获取接口变量信息

    Go利用反射reflect实现获取接口变量信息

    反射是通过实体对象获取反射对象(Value、Type),然后可以操作相应的方法。本文将利用Go语言中的反射reflect实现获取接口变量信息,需要的可以参考一下
    2022-05-05

最新评论