main.go
package main
import (
"net/http"
)
func main() {
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
http.ListenAndServe(":8080", nil)
}
ディレクトリ構造:
%GOPATH%/src/project_name/main.go
%GOPATH%/src/project_name/static/..files and folders ..
ドキュメントを読んだ後でも、ここでhttp.StripPrefix
が正確に何をするのか理解できません。
1)localhost:8080/static
を削除するとhttp.StripPrefix
にアクセスできないのはなぜですか?
2)その関数を削除すると、どのURLが/static
フォルダにマッピングされますか?
http.StripPrefix()
は、リクエストの処理をパラメータとして指定したものに転送しますが、その前に、指定されたプレフィックスを削除してリクエストURLを変更します。
したがって、たとえば、ブラウザ(またはHTTPクライアント)がリソースを要求する場合は、次のようになります。
/static/example.txt
StripPrefix
は/static/
をカットし、変更されたリクエストを http.FileServer()
によって返されたハンドラーに転送するため、リクエストされたリソースが
/example.txt
http.FileServer()
によって返されるHandler
は、ファイルrelativeのコンテンツを検索し、パラメーターとして指定されたフォルダー(またはFileSystem
)に提供します("static"
を指定しました)静的ファイルのルートになります)。
ここで、"example.txt"
はstatic
フォルダーにあるため、現在のファイルパスを取得するには、その相対パスを指定する必要があります。
この例は、httpパッケージのドキュメントページ( ここ )にあります。
// To serve a directory on disk (/tmp) under an alternate URL
// path (/tmpfiles/), use StripPrefix to modify the request
// URL's path before the FileServer sees it:
http.Handle("/tmpfiles/",
http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
説明:
FileServer()
は、静的ファイルのルートが"/tmp"
であることを通知されます。 URLが"/tmpfiles/"
で始まるようにします。したがって、誰かが"/tempfiles/example.txt"
を要求した場合、サーバーに"/tmp/example.txt"
ファイルを送信させます。
これを実現するには、URLから"/tmpfiles"
を削除する必要があり、残りはルートフォルダー"/tmp"
と比較した相対パスになります。
/tmp/example.txt
ファイルがあります
/home/go/src/js/kor.js
次に、fileserveがローカルディレクトリにサービスを提供することを伝えます。
fs := http.FileServer(http.Dir("/home/go/src/js"))
現在、ファイルサーバーは"/"
リクエストを"/home/go/src/js"+"/"
として受け取ります
http.Handle("/", fs)
はい、http://localhost/kor.js
リクエストはFileserverに伝え、kor.js
を見つけます
"/home/go/src/js" + "/" + "kor.js".
kor.js
ファイルを取得しました。
しかし、さらにクエスト名を追加すると、.
http.Handle("/static/", fs)
現在、ファイルサーバーは"/static/"
リクエストを"/home/go/src/js"+"/static/"
として受け取ります
はい、http://localhost/static/kor.js
リクエストはFileserverに伝え、kor.js
を見つけます
"/home/go/src/js" + "/static/" + "kor.js".
404エラーが発生しました。
そのため、Fileserverがhttp.StripPrefix("/tmpfiles/", ...
で取得する前に、リクエストURLを変更します。
stripPrefix
以降、ファイルサーバーは/
を代わりに使用します/static/
"/home/go/src/js" + "/" + "kor.js".
取得しましたkor.js
2つの質問に1つずつ答えます。
質問1への回答1:コードが以下のように記述されている場合:
http.Handle("/static/", http.FileServer(http.Dir("static"))
ルートフォルダは%GOPATH%/src/project_name/static/
です。 localhost:8080/static
にアクセスすると、URL /static
が http.FileServer() によって返されるハンドラーに転送されます。ただし、ルートフォルダにstatic
という名前のディレクトリまたはファイルはありません。
Answer 2 to Question 2:通常、 http.StripPrefix(を削除すると、/static
フォルダにアクセスできません) 。ただし、static
という名前のディレクトリまたはファイルがある場合は、URL localhost:8080:/static
でアクセスできます(希望するルートディレクトリではない)。
ちなみに、URLが/static
で始まっていない場合、http.ServeMux
はリクエストをリダイレクトしないため、何にもアクセスできません。