2012-12-29 5 views
39

Golangでは、静的コンテンツをルートディレクトリから配信するにはどうしたらよいのですか?ホームページから静的なコンテンツをルートから配信

は、一例として、次のような単純なWebサーバーを使用します。

package main 

import (
    "fmt" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/", HomeHandler) // homepage 
    http.ListenAndServe(":8080", nil) 
} 

func HomeHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "HomeHandler") 
} 

私は

http.Handle("/", http.FileServer(http.Dir("./"))) 

をすれば、私は「/」用の2件の登録を持っていると言ってパニックを受けます。私がインターネット上で見つけたすべてのGolangの例は、静的なコンテンツを別のディレクトリから提供することを提案していますが、それはsitemap.xml、favicon.ico、robots.txtなどの実践や常にルートから提供されることが義務付けられています。

私が求めている動作は、Apache、Nginx、またはIISなどのほとんどのWebサーバーで検出された動作であり、ルールが最初にトラバースされ、ルールが見つからない場合は実際のファイルが検索されますファイルは404sです。私の推測では、http.HandlerFuncの代わりにhttp.Handlerと書いて、拡張子の付いたファイルを参照しているかどうかを調べる必要があります。そうであれば、ファイルの存在をチェックしてファイルを提供します。そうでない場合は404sか、 "/"のためのものでした。残念ながら、私はそのような仕事をどのように開始するのかは定かではありません。私の

パートは私が上に複雑大規模な私は何かが欠けていますことを思わせるような状況だと言いますか?どんな指導も高く評価されます。

+0

ルートからのrobots.txt、favicon.icoを、または他のサービスを提供するための別の例を。実際にはルートの外部に存在していますが、http://noypi-linux.blogspot.com/2014/07/golang-web-server-basic-operatons-using.html –

答えて

25

あなたがあなた自身のServeMuxを作成できるということを私が考えたことが1つ考えられます。あなたの例にchttpを静的ファイルを提供できるServeMuxに追加しました。その後、HomeHandlerはファイルを提供するかどうかをチェックします。私はちょうど "を確認します。"しかし、あなたは多くのことをすることができます。ちょうどアイデアは、あなたが探しているものではないかもしれません。

+1

は完璧です。私は次の行を追加しました: 'regex:= regexp.MustCompile(" /([^/]*\\.[^/]*)$ ");一致する:= regex.FindStringSubmatch(r.URL.Path) '。このようにして、 '/ main.css'や'/images/test.jpg'のような拡張子で終わる任意のパスに対して静的ServeMuxを使用します。 – Nucleon

+0

ありがとうございます!私はこのようなものをしばらく探していました!!!!!! –

38

代替(ServeMuxを使用していない)ソリューションは、明示的にルートディレクトリにある各ファイルを提供することです。その根底にあるアイデアは、ルートベースのファイルの数を非常に少なく保つことです。 sitemap.xmlfavicon.icorobots.txtが実際にルートの外に提供することが義務付けされています

package main 

import (
    "fmt" 
    "net/http" 
) 

func HomeHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "HomeHandler") 
} 

func serveSingle(pattern string, filename string) { 
    http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { 
     http.ServeFile(w, r, filename) 
    }) 
} 

func main() { 
    http.HandleFunc("/", HomeHandler) // homepage 

    // Mandatory root-based resources 
    serveSingle("/sitemap.xml", "./sitemap.xml") 
    serveSingle("/favicon.ico", "./favicon.ico") 
    serveSingle("/robots.txt", "./robots.txt") 

    // Normal resources 
    http.Handle("/static", http.FileServer(http.Dir("./static/"))) 

    http.ListenAndServe(":8080", nil) 
} 

例えば、適切なサブディレクトリに他のすべてのリソース(CSSなど、JSを)移動してください。 /static/

+1

私はrootのディレクトリをきれいにするように強制するので、このアプローチが本当に好きです。+ –

+17

フォルダ内の静的リソースを扱うために、http.Handle( "/ css /"、http.StripPrefix( "/ css /") 、http.FileServer(http.Dir( "./ css /")))) ' –

+0

私のために働いた。ありがとう! – Japanish

19

Gorilla mux package使用:

r := mux.NewRouter() 

//put your regular handlers here 

//then comes root handler 
r.HandleFunc("/", homePageHandler) 
//if a path not found until now, e.g. "/image/tiny.png" 
//this will look at "./public/image/tiny.png" at filesystem 
r.PathPrefix("/").Handler(http.FileServer(http.Dir("./public/"))) 

http.Handle("/", r) 
http.ListenAndServe(":8080", nil) 
関連する問題