1. ホーム
  2. go

[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?

2023-01-12 03:35:01

質問

go ウェブサーバを使って 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 :) によって適切にレンダリングされたそのファイルが表示されます)。

UPDATE: "/" 以外の url からファイルを提供します。

ファイルを提供する場合、例えば、フォルダ ./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全体をファイルへの相対パスとして扱うからです。

幸いなことに、組み込み関数で簡単に解決できます。