2013-04-05 21 views
36

ile bir kök URL'ye sahip statik içerik sunma Bir Go web sunucusunda URL'leri yönlendirmek için Gorilla araç setinin mux package kullanıyorum.Goril araç seti

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) 
} 

dizin yapısı şöyledir::

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

JavaScript ve CSS dosyalarını böyle index.html başvurulan:

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

Aşağıdaki Git koduna sahip bir kılavuz olarak this question Kullanılması Web tarayıcımda http://localhost:8100'a eriştiğimde, index.html içeriği başarıyla teslim edildi, ancak tüm js ve css URL'leri 404'leri döndürür.

Programı, static alt dizinlerindeki dosyaları sunmak için nasıl alabilirim?

+0

Sen http://stackoverflow.com/questions/ kök veya alt dizinleri statik sunum dosyalarını hakkında (gerçi Gorilla kullanmayan) Bu tartışmayı görmek isteyebilirsiniz 14086063/service-homepage-and-static-content-from-root/14187941 # 14187941 – Deleplace

+0

@Ripounet, Araştırmam sırasında bu soruyu gördüm, ancak Gorilla'yı kullanmadığı için hiçbir zaman çalışma fikrini elde edemedim hedeflerimden birinin root di dosyasında herhangi bir statik dosya olmamasıydı. projemde rectory (main.go'nun yanında). Ayrıca, kurulumumda da çalışmayan [@ Joe'nun cevabı] (http://stackoverflow.com/a/15835001/971556) 'a çok benziyor. – jason

cevap

54

Sana PathPrefix arıyor olabilir düşünüyorum ... deneme yanılma bir sürü sonra

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

Bu yardımcı oldu, teşekkürler. Yine de iki takma ad almaya çalışırken bir sorunla karşılaştım. Örneğin, \t 'r.PathPrefix ("/a/") İşleyici (http.FileServer (http.Dir (" b/"))) \t r.PathPrefix ("/") İşleyici (http.FileServer (http. Dir ("c /"))) 'Bu durumda, c /' deki her şey sunulur, fakat değil, b/'. Birkaç farklı ince varyasyonu denedim ama başarıya ulaşamadı. Herhangi bir fikir? – markdsievers

+1

@markdsievers, URL’den "/ a /" bölümünü çıkarmanız gerekebilir. Örnek: r.PathPrefix ("/ a /") İşleyici (http.StripPrefix ("/ a /", http.FileServer (http.Dir ("b")))). – Roman

+1

NotFound işleyici eklemek mümkün mü? –

4

bu deneyin:

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

Bu, "src", href vb. Özniteliklerini "/static/js/jquery.min.js" biçimine çevirmek anlamına gelir. Teknik olarak * çalışsa da *. –

+0

JS ve CSS dosyalarının yüklenmesine izin verecek, ancak 'index.html dosyası artık http: // localhost: 8100 /' – jason

+0

adresinde bulunmayacak; 'statik' klasöründe js' vb. – Joe

30

, yukarıdaki cevaplar her ikisi ile geliyor bana neyin yardımcı olduğunu benim için çalıştı. Web uygulamasının kök dizininde statik klasör var.

PathPrefix ile birlikte Rotanızı yinelemeli olarak çalışmak için StripPrefix kullanmam gerekiyordu.

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) 
} 

Ben başkası sahip sorunları yardımcı olur.

+10

Bu, benim için çalışan tek cevabı. – TheHippo

+0

[golang çalışma alanı] 'nı kullanan herkes için (https://golang.org/doc/code.html) 's: = ...' çalışma dizini '[çalışma alanı]/src' olduğunda aşağıdaki gibi olmalıdır. . 's: = http.StripPrefix ("/static/", httpFileServer (http.Dir (" ./ web/statik/"))) – Frito

7

Bu kod burada oldukça güzel çalışıyor ve yeniden kullanılabilir.

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/") 
0

Bu kökünde index.html hizmet veren yanı sıra, klasör bayrağı içindeki tüm dosyaları vermektedir.

Kullanımı

//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 ./ 

Kod

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)) 
}