解決golang http.FileServer 遇到的坑
上次寫了一個(gè)2行實(shí)現(xiàn)一個(gè)靜態(tài)服務(wù)器的文章
今天群里有個(gè)哥們是這么寫居然返回的是404 見鬼了嘛??
http.handle("/js", http.FileServer(http.Dir("js"))
http.ListenAndServe("8080", nil)
大概的意思就是綁定 路由為 js 的時(shí)候訪問這個(gè)js 文件夾 看了一下確實(shí)代碼上面沒什么毛病。但是路徑怎么修改 也不好使。
我把代碼拿到我的 電腦上面運(yùn)行 shitfuck 這是搞什么啊居然出現(xiàn)下面的這個(gè)情況
奇怪居然在我電腦上面也不能執(zhí)行了。莫非我的文件夾權(quán)限有問題
給賦值一下 777 權(quán)限 重新運(yùn)行
居然還不好使。來回改路徑 就這么搗鼓了兩個(gè)小時(shí)無意中看到一個(gè)文章就是說的這個(gè)
加一個(gè)StripPrefix 方法就好了
那這個(gè)玩意是干嘛的呢。看看手冊(cè)
然后我的代碼就變成這個(gè)樣子
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))
http.StripPrefix用于過濾request,參數(shù)里的handler的request過濾掉特定的前序,只有這樣,才能正確顯示文件目錄。 shitfuck
看一下我的路徑 以及下面存放的文件
修改代碼完成后就這么神奇般的解決了
浪費(fèi)了兩個(gè)小時(shí)不過 還不錯(cuò)最起碼解決問題了。
補(bǔ)充:Golang1.8標(biāo)準(zhǔn)庫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() { //瀏覽器打開的時(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("訪問靜態(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è)置單文件訪問,不能訪問目錄 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) } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
重學(xué)Go語言之?dāng)?shù)組的具體使用詳解
Go的數(shù)組是一種復(fù)合數(shù)據(jù)類型,在平時(shí)開發(fā)中并不常用,更常用的是切片(slice),可以把切片看作是能動(dòng)態(tài)擴(kuò)容的數(shù)組,切片的底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,所以數(shù)組雖不常用,但仍然有必要掌握2023-02-02GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解
這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Golang判斷struct/slice/map是否相等以及對(duì)比的方法總結(jié)
平時(shí)開發(fā)中對(duì)比兩個(gè)struct或者map、slice是否相等是經(jīng)常遇到的,有很多對(duì)比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等也是經(jīng)常容易混淆的,這么多種對(duì)比方式,適用場(chǎng)景和優(yōu)缺點(diǎn)都有哪些呢?今天我們來具體總結(jié)一下,感興趣的小伙伴們可以參考借鑒2022-11-11解決Goland中利用HTTPClient發(fā)送請(qǐng)求超時(shí)返回EOF錯(cuò)誤DEBUG
這篇文章主要介紹了解決Goland中利用HTTPClient發(fā)送請(qǐng)求超時(shí)返回EOF錯(cuò)誤DEBUG,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12向Rust學(xué)習(xí)Go考慮簡(jiǎn)單字符串插值特性示例解析
這篇文章主要為大家介紹了向Rust學(xué)習(xí)Go考慮簡(jiǎn)單字符串插值特性示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02golang值類型轉(zhuǎn)換成[]uint8類型的操作
這篇文章主要介紹了golang值類型轉(zhuǎn)換成[]uint8類型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05Go語言輕量級(jí)線程Goroutine用法實(shí)例
這篇文章主要介紹了Go語言輕量級(jí)線程Goroutine用法,實(shí)例分析了goroutine使用技巧,需要的朋友可以參考下2015-02-02golang?channel多協(xié)程通信常用方法底層原理全面解析
channel?是?goroutine?與?goroutine?之間通信的重要橋梁,借助?channel,我們能很輕易的寫出一個(gè)多協(xié)程通信程序,今天,我們就來看看這個(gè)?channel?的常用用法以及底層原理2023-09-09Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法
*gin.Context是處理HTTP請(qǐng)求的核心,ctx代表"context"(上下文),它包含了處理請(qǐng)求所需的所有信息和方法,例如請(qǐng)求數(shù)據(jù)、響應(yīng)構(gòu)建器、路由參數(shù)等,這篇文章主要介紹了Go中g(shù)in框架的*gin.Context參數(shù)常見實(shí)用方法,需要的朋友可以參考下2024-07-07