2013-03-19 11 views
6

静的リソースが配信されない理由を理解できません。ここでは、コードは次のとおりです。Go:http静的ディレクトリが提供されていない

func main() { 
    http.HandleFunc("/", get_shows) 
    http.HandleFunc("/get", get_show_json) 
    http.HandleFunc("/set", set_shows) 
    http.Handle("/css/", http.FileServer(http.Dir("./css"))) 
    http.Handle("/js/", http.FileServer(http.Dir("./js"))) 
    http.ListenAndServe(":8080", nil) 
} 

私はhttp://myhost.fake/css/またはhttp://myhost.fake/css/main.cssに移動し、プログラムを実行します(これらはファイルシステムに存在する)、私は404エラーを取得します。 "./css"をディレクトリのフルパスに置き換えると同じことが言えます。 js静的ディレクトリの場合も同様です。私の他のハンドラーは正常に動作します。私はLinux上です。ありがとう!

+0

これは、 "Linuxの" 下に提出され、なぜ?どのようにして質問の主なカテゴリに「行く」ことができますか? – Jeremy

+2

おそらく今は '/ full/path/to/css/css /'を探していると思います。 'httpdir()'に 'js'と' css'ディレクトリの親ディレクトリを与えてみてください。 –

+3

@thesystem、そうです。しかし、これは私には明らかではありません。 – Jeremy

答えて

12

ハンドラパス(/css/)は、FileServerハンドラと接頭辞の後のファイルに渡されます。 つまり、http://myhost.fake/css/test.cssにアクセスしたときに、FileServerがファイル./css/css/test.cssを見つけようとしています。

HTTPパッケージは/css/プレフィックスを除去する機能StripPrefixを提供します。

これはそれを行う必要があります。

http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("css")))) 
+1

おかげで私は今 'HTTPを使用しています。。。 (「/ CSS /」、http.FileServer(http.Dir(「」)))ハンドル '期待通りに作業している。 – Jeremy

+2

また、相対パスはからサーバーのディレクトリを基準に解決されていることを念頭に置いてクマ静的な実行可能ファイルが(そのバイナリと比べていない)を実行している。問題をデバッグするために、私はそれが役に立つ 'そこにまたはファイルをリスト' log.Printf(os.Getwd())をトスすることが分かってきました。 – dghubble

0

今は確認できませんが、IIRC:s/"./css"/"css"/; s/"./js"/"js"/

編集:今、私は最終的にソースを確認することができること:これは私がやったことで、何が私の作品:./images/*.{gif,png,...}

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

すべての画像が適切に務めます。スクリプトについての同じ話。

+0

これは問題ではないようです。 – Jeremy

+0

Damned !.私はちょうど日前とまったく同じ問題を解決して、私は – zzzz

+0

@Jeremy :-(正しい答えを思い出すことができない:ちょうどあなたの参照のために、私は実用的なソリューションへの答えを更新しました – zzzz

関連する問題