技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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