http.StripPrefix()でフォルダ階層とURLの指定を分離する【Go】
http.Handle()とhttp.FileServer()を用いた、サーブ方法には問題となる点がありました。
http.FileServer()で階層ごと複数ファイルをサーブする【Go】 - 技術向上
http.Handle("/abc/", http.FileServer(http.Dir("templates")))
上記の場合、/abc/にアクセスした際にフォルダ等が表示されるには、
templates abc a.gohtml a.png b b.png
のように、アクセスURLの階層(/abc/)がDirにキャストした階層(templates)の下に存在している必要があります。
これでは使い勝手が悪いです。http.StripPrefix()は、この問題を解決します。
階層が次のようになっている場合で、
templates a.gohtml a.png b b.png
下記goファイルの記述があるとすると、
func main() { http.Handle("/abc/", http.StripPrefix("/abc", http.FileServer(http.Dir("templates")))) // 「/abc」をhttp.FileServer()が捜索するURLから除く http.ListenAndServe(":8080", nil) }
「/abc/」にアクセスすれば、a.gohtml、a.png、bが表示されます。
「/abc/b」にアクセスすれば、b.pngが表示されます。
このように、http.StripPrefix()は、第1引数に指定したパスを、
http.FileServer()が捜索するURLから取り除きます。
(http.StripPrefix()の指定がない場合、「http.Dirにキャストしたパス + http.Handle()の第1引数」を捜索します。)
※タイトルには、「フォルダ階層とURLの指定を分離する」と書きましたが、厳密に言うと分離ではありません。
先ほど挙げた、実際に存在するbという階層に対して、「/abc/b」のようにURLを指定してアクセスする例からもわかるでしょう。
タイトルを短くした上で大方の意味が伝わるようにと、このタイトルにしました。
stackoverflow.com