Go Webサーバーを使用してindex.html(またはその他の静的HTMLファイル)を提供するにはどうすればよいですか?
Go Webサーバーから提供できる基本的な静的HTMLファイル(たとえば、記事など)が必要です。 HTMLは、HTMLテンプレートを使用している場合のように、goプログラムの外部で変更可能である必要があります。
これはハードコードされたテキスト(「Hello world!」)のみをホストする私のWebサーバーです。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":3000", nil)
}
このタスクは、Golang net/httpパッケージを使用すると非常に簡単です。
あなたがする必要があるのは:
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir("./static")))
http.ListenAndServe(":3000", nil)
}
静的ファイルがプロジェクトのルートディレクトリのstatic
という名前のフォルダーにあると仮定します。
フォルダーがstatic
にある場合、index.html
ファイルがhttp://localhost:3000/
を呼び出しているため、使用可能なすべてのファイルをリストするのではなく、そのインデックスファイルがレンダリングされます。
さらに、そのフォルダー内の他のファイル(たとえばhttp://localhost:3000/clients.html
)を呼び出すと、そのファイルが表示され、ブラウザーによって適切にレンダリングされます(少なくともChrome、Firefox、およびSafari :))
ファイルを提供したい場合は、フォルダー./public
からurl:localhost:3000/static
と言います追加機能を使用:func StripPrefix(prefix string, h Handler) Handler
のように:
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
http.ListenAndServe(":3000", nil)
}
そのおかげで、./public
からのすべてのファイルはlocalhost:3000/static
の下で利用可能です
http.StripPrefix
関数がない場合、ファイルlocalhost:3000/static/test.html
にアクセスしようとすると、サーバーは./public/static/test.html
でそのファイルを探します。
これは、サーバーがURI全体をファイルへの相対パスとして扱うためです。
幸いなことに、組み込み関数で簡単に解決できます。
FTPサーバーではない:これは、通常のWebサーバーが行うように、
index.html
ホームページを提供することを意図したものとは異なるものです。たとえば、ブラウザでmydomain.comにアクセスすると、index.html
がレンダリングされます。
それは主に「 Writing Web Applications 」が説明するものであり、プロジェクトが hugo (静的htmlサイトジェネレーター).
ファイルを読み取り、ContentType "text/html"で応答することです。
func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
err := server.renderFile(w, r.URL.Path)
if err != nil {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.WriteHeader(http.StatusNotFound)
server.fn404(w, r)
}
}
renderFile()
を使用して、基本的に正しいタイプを読み取り、設定します。
file, err = ioutil.ReadFile(server.MediaPath + filename)
if ext != "" {
w.Header().Set("Content-Type", mime.TypeByExtension(ext))
}