web-dev-qa-db-ja.com

静的ファイルにアクセスするためにhttp.StripPrefixを使用する必要があるのはなぜですか?

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フォルダにマッピングされますか?

32
Dante

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
36
icza

と仮定する

ファイルがあります

/home/go/src/js/kor.js

次に、fileserveがローカルディレクトリにサービスを提供することを伝えます。

fs := http.FileServer(http.Dir("/home/go/src/js"))

例1-FilerserverルートへのルートURL

現在、ファイルサーバーは"/"リクエストを"/home/go/src/js"+"/"として受け取ります

http.Handle("/", fs)

はい、http://localhost/kor.jsリクエストはFileserverに伝え、kor.jsを見つけます

"/home/go/src/js" +  "/"  + "kor.js".

kor.jsファイルを取得しました。

例2-ファイルサーバールートへのカスタムURL

しかし、さらにクエスト名を追加すると、.

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エラーが発生しました。

例3-Fileserver rootへのカスタムURL

そのため、Fileserverがhttp.StripPrefix("/tmpfiles/", ...で取得する前に、リクエストURLを変更します。

stripPrefix以降、ファイルサーバーは/を代わりに使用します/static/

"/home/go/src/js" +  "/"  + "kor.js".

取得しましたkor.js

5
Youngsoo Yi

2つの質問に1つずつ答えます。

質問1への回答1:コードが以下のように記述されている場合:

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

ルートフォルダは%GOPATH%/src/project_name/static/です。 localhost:8080/staticにアクセスすると、URL /statichttp.FileServer() によって返されるハンドラーに転送されます。ただし、ルートフォルダにstaticという名前のディレクトリまたはファイルはありません。

Answer 2 to Question 2:通常、 http.StripPrefix(を削除すると、/staticフォルダにアクセスできません) 。ただし、staticという名前のディレクトリまたはファイルがある場合は、URL localhost:8080:/staticでアクセスできます(希望するルートディレクトリではない)。

ちなみに、URLが/staticで始まっていない場合、http.ServeMuxはリクエストをリダイレクトしないため、何にもアクセスできません。

1
seafooler