2013-04-05 4 views
36

Я пытаюсь использовать набор инструментов Gorilla toolkit mux package для маршрутизации URL-адресов на веб-сервере Go. Использование this question в качестве руководства я имею следующий Перейти код:Обслуживание статического содержимого с корневым URL-адресом с помощью инструментария Gorilla

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 доставлено успешно, однако все js и css URL-адреса возвращаются 404s.

Как я могу заставить программу обслуживать файлы из static подкаталогов?

+0

Вы можете увидеть это обсуждение (не используя Горилла, хотя) об обслуживании статических файлов из корня или подкаталогов http://stackoverflow.com/questions/ 14086063/serve-homepage-and-static-content-from-root/14187941 # 14187941 – Deleplace

+0

@Ripounet, я видел этот вопрос во время моих исследований, однако, поскольку он не использовал Gorilla, я никогда не мог заставить идеи работать с моей установкой, где одной из моих целей было не иметь никаких статических файлов в корневом ди ректор моего проекта (рядом с 'main.go'). Кроме того, он кажется очень похожим на ответ [@ Joe] (http://stackoverflow.com/a/15835001/971556), который также не будет работать с моей настройкой. – jason

ответ

54

Я думаю, что вы могли бы искать 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.Handle("/", r) 
    http.ListenAndServe(":8100", nil) 
} 
+0

Это было полезно, спасибо. У меня была проблема с попыткой получить две псевдонимы. например, \t 'r.PathPrefix ("/a/"). Обработчик (http.FileServer (http.Dir (" b/"))) \t r.PathPrefix ("/"). Обработчик (http.FileServer (http. Dir ("c /"))) 'В этом случае все в' c/'обслуживается, но не' b/'. Пробовал несколько разных тонких вариаций, но безуспешно. Есть идеи? – markdsievers

+1

@markdsievers, вам может потребоваться удалить часть «/ a /» из URL-адреса. Пример: 'r.PathPrefix ("/a/"). Обработчик (http.StripPrefix ("/a/", http.FileServer (http.Dir (" b "))))'. – Roman

+1

Можно ли добавить обработчик NotFound? –

4

Попробуйте это:

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

Это будет означать изменение всех атрибутов 'src',' href' и т. Д. В форме '' /static/js/jquery.min.js''. Хотя технически * будет * работать. –

+0

Это позволит загружать файлы JS и CSS, но файл 'index.html' больше не будет доступен в' http: // localhost: 8100/' – jason

+0

Обычно я помещаю все' images', 'css', 'js' и т. д. в папке' static'. – Joe

30

После многих проб и ошибок, как выше ответы помогли мне придумать, что работал на меня. У меня есть статическая папка в корневом каталоге веб-приложения.

Наряду с 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) 
} 

Я надеюсь, что это поможет кому-то еще иметь проблемы.

+10

Это единственный ответ, который работал на меня. – TheHippo

+0

Для тех, кто использует рабочую область [golang workspace] (https://golang.org/doc/code.html) 's: = ...', следует читать следующее, когда ваш рабочий каталог '[workspace]/src' .. . 's: = http.StripPrefix ("/static/", httpFileServer (http.Dir (" ./ web/static/")))' – Frito

7

У меня есть этот код здесь, который работает довольно хорошо и может использоваться повторно.

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

Это обслуживает все файлы внутри флага папки, а также служит 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)) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^