解決golang http.FileServer 遇到的坑
上次寫(xiě)了一個(gè)2行實(shí)現(xiàn)一個(gè)靜態(tài)服務(wù)器的文章
今天群里有個(gè)哥們是這么寫(xiě)居然返回的是404 見(jiàn)鬼了嘛??
http.handle("/js", http.FileServer(http.Dir("js"))
http.ListenAndServe("8080", nil)
大概的意思就是綁定 路由為 js 的時(shí)候訪問(wèn)這個(gè)js 文件夾 看了一下確實(shí)代碼上面沒(méi)什么毛病。但是路徑怎么修改 也不好使。
我把代碼拿到我的 電腦上面運(yùn)行 shitfuck 這是搞什么啊居然出現(xiàn)下面的這個(gè)情況

奇怪居然在我電腦上面也不能執(zhí)行了。莫非我的文件夾權(quán)限有問(wèn)題
給賦值一下 777 權(quán)限 重新運(yùn)行
居然還不好使。來(lái)回改路徑 就這么搗鼓了兩個(gè)小時(shí)無(wú)意中看到一個(gè)文章就是說(shuō)的這個(gè)
加一個(gè)StripPrefix 方法就好了
那這個(gè)玩意是干嘛的呢??纯词謨?cè)

然后我的代碼就變成這個(gè)樣子
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))
http.StripPrefix用于過(guò)濾request,參數(shù)里的handler的request過(guò)濾掉特定的前序,只有這樣,才能正確顯示文件目錄。 shitfuck
看一下我的路徑 以及下面存放的文件

修改代碼完成后就這么神奇般的解決了

浪費(fèi)了兩個(gè)小時(shí)不過(guò) 還不錯(cuò)最起碼解決問(wèn)題了。
補(bǔ)充:Golang1.8標(biāo)準(zhǔn)庫(kù)http.Fileserver跟http.ServerFile小例子
我就廢話不多說(shuō)了,大家還是直接看代碼吧~
package main
import (
"fmt"
"net/http"
"os"
"path"
"strings"
)
var staticfs = http.FileServer(http.Dir("D:\\code\\20160902\\src\\"))
func main() {
//瀏覽器打開(kāi)的時(shí)候顯示的就是D:\\code\\20160902\\src\\client目錄下的內(nèi)容"
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("訪問(wèn)靜態(tài)文件:%s\n", r.URL.Path)
old := r.URL.Path
r.URL.Path = strings.Replace(old, "/static", "/client", 1)
staticfs.ServeHTTP(w, r)
}
//設(shè)置單文件訪問(wèn),不能訪問(wèn)目錄
func js(w http.ResponseWriter, r *http.Request) {
fmt.Printf("不能訪問(wèn)目錄:%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)
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- 使用Go語(yǔ)言寫(xiě)一個(gè)Http?Server的實(shí)現(xiàn)
- Go語(yǔ)言HTTPServer開(kāi)發(fā)的六種方式小結(jié)
- Golang簡(jiǎn)單實(shí)現(xiàn)http的server端和client端
- Golang實(shí)現(xiàn)http server提供壓縮文件下載功能
- 在Golang中使用http.FileServer返回靜態(tài)文件的操作
- golang實(shí)現(xiàn)http server提供文件下載功能
- 深入理解Golang之http server的實(shí)現(xiàn)
- 一文詳解Go Http Server原理
相關(guān)文章
Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán)
這篇文章主要介紹了Go實(shí)現(xiàn)基于RSA加密算法的接口鑒權(quán),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀
這篇文章主要為大家介紹了go內(nèi)存緩存BigCache實(shí)現(xiàn)BytesQueue源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Go語(yǔ)言如何使用分布式鎖解決并發(fā)問(wèn)題
這篇文章主要為大家詳細(xì)介紹了Go 語(yǔ)言生態(tài)中基于 Redis 實(shí)現(xiàn)的分布式鎖庫(kù) redsync,并探討其使用方法和實(shí)現(xiàn)原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
Go?Wails開(kāi)發(fā)桌面應(yīng)用使用示例探索
這篇文章主要為大家介紹了Go?Wails的使用示例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過(guò)實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語(yǔ)言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05

