programing

Gorilla 툴킷을 사용하여 루트 URL로 정적 콘텐츠 제공

procenter 2021. 1. 17. 12:08
반응형

Gorilla 툴킷을 사용하여 루트 URL로 정적 콘텐츠 제공


Go 웹 서버에서 URL을 라우팅 하기 위해 Gorilla 툴킷의 mux패키지 를 사용하려고 합니다. 이 질문 을 가이드로 사용 하면 다음 Go 코드가 있습니다.

func main() {
    r := mux.NewRouter()
    r.Handle("/", http.FileServer(http.Dir("./static/")))
    r.HandleFunc("/search/{searchTerm}", Search)
    r.HandleFunc("/load/{dataId}", Load)
    http.Handle("/", r)
    http.ListenAndServe(":8100", nil)
}

디렉토리 구조는 다음과 같습니다.

...
main.go
static\
  | index.html
  | js\
     | <js files>
  | css\
     | <css files>

Javascript 및 CSS 파일은 index.html다음과 같이 참조됩니다 .

...
<link rel="stylesheet" href="css/redmond/jquery-ui.min.css"/>
<script src="js/jquery.min.js"></script>
...

http://localhost:8100내 웹 브라우저에서 액세스 하면 index.html콘텐츠가 성공적으로 전달되지만 모든 jscssURL이 404를 반환합니다.

프로그램이 static하위 디렉토리에서 파일을 제공하도록하려면 어떻게 해야합니까?


나는 당신이 찾고있을 것이라고 생각합니다 PathPrefix...

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/search/{searchTerm}", Search)
    r.HandleFunc("/load/{dataId}", Load)
    r.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/")))
    http.ListenAndServe(":8100", r)
}

많은 시행 착오 끝에 위의 두 답변 모두 나를 위해 일한 것을 생각해내는 데 도움이되었습니다. 웹 앱의 루트 디렉터리에 정적 폴더가 있습니다.

함께 작업 경로를 재귀 적으로 가져 오는 데 PathPrefix사용해야 StripPrefix했습니다.

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    s := http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))
    r.PathPrefix("/static/").Handler(s)
    http.Handle("/", r)
    err := http.ListenAndServe(":8081", nil)
}

문제가있는 다른 사람에게 도움이되기를 바랍니다.


여기에 꽤 잘 작동하고 재사용 할 수있는이 코드가 있습니다.

func ServeStatic(router *mux.Router, staticDirectory string) {
    staticPaths := map[string]string{
        "styles":           staticDirectory + "/styles/",
        "bower_components": staticDirectory + "/bower_components/",
        "images":           staticDirectory + "/images/",
        "scripts":          staticDirectory + "/scripts/",
    }
    for pathName, pathValue := range staticPaths {
        pathPrefix := "/" + pathName + "/"
        router.PathPrefix(pathPrefix).Handler(http.StripPrefix(pathPrefix,
            http.FileServer(http.Dir(pathValue))))
    }
}
router := mux.NewRouter()
ServeStatic(router, "/static/")

이 시도:

fileHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("/absolute/path/static")))
http.Handle("/static/", fileHandler)

이것은 폴더 플래그 내의 모든 파일을 제공하고 루트에서 index.html을 제공합니다.

용법

   //port default values is 8500
   //folder defaults to the current directory
   go run main.go 

   //your case, dont forget the last slash
   go run main.go -folder static/

   //dont
   go run main.go -folder ./

암호

    package main

import (
    "flag"
    "fmt"
    "net/http"
    "os"
    "strconv"
    "strings"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
    "github.com/kr/fs"
)

func main() {
    mux := mux.NewRouter()

    var port int
    var folder string
    flag.IntVar(&port, "port", 8500, "help message for port")
    flag.StringVar(&folder, "folder", "", "help message for folder")

    flag.Parse()

    walker := fs.Walk("./" + folder)
    for walker.Step() {
        var www string

        if err := walker.Err(); err != nil {
            fmt.Fprintln(os.Stderr, "eroooooo")
            continue
        }
        www = walker.Path()
        if info, err := os.Stat(www); err == nil && !info.IsDir() {
            mux.HandleFunc("/"+strings.Replace(www, folder, "", -1), func(w http.ResponseWriter, r *http.Request) {
                http.ServeFile(w, r, www)
            })
        }
    }
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, folder+"index.html")
    })
    http.ListenAndServe(":"+strconv.Itoa(port), handlers.LoggingHandler(os.Stdout, mux))
}

참조 URL : https://stackoverflow.com/questions/15834278/serving-static-content-with-a-root-url-with-the-gorilla-toolkit

반응형