在go文件服务器加入http.StripPrefix的用途介绍

 更新时间:2020年12月18日 11:52:44   作者:yyyzhhhhh  
这篇文章主要介绍了在go文件服务器加入http.StripPrefix的用途介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

例子:

http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))

当访问localhost:xxxx/tmpfiles时,会路由到fileserver进行处理

当访问URL为/tmpfiles/example.txt时,fileserver会将/tmp与URL进行拼接,得到/tmp/tmpfiles/example.txt,而实际上example.txt的地址是/tmp/example.txt,因此这样将访问不到相应的文件,返回404 NOT FOUND。

因此解决方案就是把URL中的/tmpfiles/去掉,而http.StripPrefix做的就是这个。

补充:go语言实现一个简单的文件服务器 http.FileServer

代码如下:

package main
import (
 "flag"
 "fmt"
 "github.com/julienschmidt/httprouter"
 "log"
 "net/http"
 "strings"
 "time"
)
func main() {
 root := flag.String("p", "", "file server root directory")
 flag.Parse()
 if len(*root) == 0 {
 log.Fatalln("file server root directory not set")
 }
 if !strings.HasPrefix(*root, "/") {
 log.Fatalln("file server root directory not begin with '/'")
 }
 if !strings.HasSuffix(*root, "/") {
 log.Fatalln("file server root directory not end with '/'")
 }
 p, h := NewFileHandle(*root)
 r := httprouter.New()
 r.GET(p, LogHandle(h))
 log.Fatalln(http.ListenAndServe(":8080", r))
}
func NewFileHandle(path string) (string, httprouter.Handle) {
 return fmt.Sprintf("%s*files", path), func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
 http.StripPrefix(path, http.FileServer(http.Dir(path))).ServeHTTP(w, r)
 }
}
func LogHandle(handle httprouter.Handle) httprouter.Handle {
 return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
 now := time.Now()
 handle(w, r, p)
 log.Printf("%s %s %s done in %v", r.RemoteAddr, r.Method, r.URL.Path, time.Since(now))
 }
}

准备测试文件

编译运行

用浏览器访问

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

相关文章

  • 源码剖析Golang中map扩容底层的实现

    源码剖析Golang中map扩容底层的实现

    之前的文章详细介绍过Go切片和map的基本使用,以及切片的扩容机制。本文针对map的扩容,会从源码的角度全面的剖析一下map扩容的底层实现,需要的可以参考一下
    2023-03-03
  • 深入理解Golang中WebSocket和WSS的支持

    深入理解Golang中WebSocket和WSS的支持

    本文主要介绍了深入理解Golang中WebSocket和WSS的支持,实现了Golang构建WebSocket服务器和客户端,并使用自签名证书实现WSS的功能,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Go语言实现管理多个数据库连接

    Go语言实现管理多个数据库连接

    在软件开发过程中,使用 MySQL、PostgreSQL 或其他数据库是很常见的,由于配置和要求不同,管理这些连接可能具有挑战性,下面就来和大家聊聊如何在Go中管理多个数据库连接吧
    2023-10-10
  • 浅谈golang 中time.After释放的问题

    浅谈golang 中time.After释放的问题

    这篇文章主要介绍了浅谈golang 中time.After释放的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • GO语言基础库os包的函数全面解析

    GO语言基础库os包的函数全面解析

    这篇文章主要为大家介绍了GO语言基础库os包的函数全面解析, 有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • CMD下执行Go出现中文乱码的解决方法

    CMD下执行Go出现中文乱码的解决方法

    需要在Go写的服务里面调用命令行或者批处理,并根据返回的结果做处理。但是windows下面用cmd返回中文会出现乱码,本文就详细的介绍一下解决方法,感兴趣的可以了解一下
    2021-12-12
  • go zero微服务实战性能优化极致秒杀

    go zero微服务实战性能优化极致秒杀

    这篇文章主要为大家介绍了go-zero微服务实战性能优化极致秒杀功能实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang使用Swagger文档教程详解

    Golang使用Swagger文档教程详解

    这篇文章主要为大家详细介绍Golang使用Swagger文档教程的相关知识,文中通过示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-12-12
  • golang的串行处理和并行处理区别

    golang的串行处理和并行处理区别

    golang对比其它语言最大的优势就是并行计算(一个go就能实现并发),工作中经常遇到并发的场景, 本文主要介绍了golang的串行处理和并行处理,感兴趣的可以了解一下
    2021-07-07
  • Golang在Window环境使用Imagick7的过程

    Golang在Window环境使用Imagick7的过程

    这篇文章主要介绍了Golang在Window环境使用Imagick7的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11

最新评论