# gin で static.LocalFile を使っていて、特定のファイルだけ外に redirect させたいとき

# 解決しようとする課題

gin で static middleware を使って 静的なアセットファイルを公開していて

	r.Use(static.Serve("/", static.LocalFile("./assets", false)))

特定のファイルは他所にリダイレクトさせたい時はどうすればいいのか

# 解決策

それが仕様なのか実装なのかよく調べていないのですが、gin のルータがパスを探す時はコンテキストに追加した順番に探しているみたいなので static.LocalFile()より先に リダイレクトを追加しておけば良いです

	r.GET("/connectcli/connectcli@v1.0.0", func(c *gin.Context) {
		c.Redirect(http.StatusFound, "http://kerokero.uedasoft.com/connect/connectcli@v1.0.0")
	})
	r.Use(static.Serve("/", static.LocalFile("./assets", false)))

同様に static.LocalFile()より後に リダイレクトを追加すると、当該のファイルがフォルダ内に ある時はそのファイルを、なければリダイレクト という動作になります

	r.Use(static.Serve("/", static.LocalFile("./assets", false)))
	r.GET("/connectcli/connectcli@v1.0.0", func(c *gin.Context) {
		c.Redirect(http.StatusFound, "http://kerokero.uedasoft.com/connect/connectcli@v1.0.0")
	})

# 感想

コード内の記述順序が動作と直接対応しててわかりやすいセマンティックでキレイだなと思いました

# references


Last Updated: 8/21/2022, 4:09:08 AM