Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Golang gorilla expects trailing slash on static serving

Tags:

go

gorilla

I want to serve the swagger-ui using gorilla/mux and http.FileServer.

This is the routing that works so far:

router := mux.NewRouter()
router.PathPrefix("/swagger-ui/").Handler(http.StripPrefix("/swagger-ui/", 
http.FileServer(http.Dir("swagger-ui/"))))
http.ListenAndServe(":8080", router)

The problem is: only a GET /swagger-ui/ returns the swagger page. When I do (what most users also expect) a GET /swagger-ui without trailing slash I get a 404.

How can this be solved?

like image 611
Subby Avatar asked Oct 29 '22 00:10

Subby


1 Answers

You have probably found the answer as the question is nearly two years old, but I will write the answer here so that anybody who comes across this question can see it.

You just need to define your gorilla router as: router := mux.NewRouter().StrictSlash(true)

StrictSlash func(value bool) *Router StrictSlash defines the trailing slash behavior for new routes. The initial value is false.

When true, if the route path is "/path/", accessing "/path" will perform a redirect to the former and vice versa. In other words, your application will always see the path as specified in the route.

When false, if the route path is "/path", accessing "/path/" will not match this route and vice versa.

The re-direct is a HTTP 301 (Moved Permanently). Note that when this is set for routes with a non-idempotent method (e.g. POST, PUT), the subsequent re-directed request will be made as a GET by most clients. Use middleware or client settings to modify this behaviour as needed.

Special case: when a route sets a path prefix using the PathPrefix() method, strict slash is ignored for that route because the redirect behavior can't be determined from a prefix alone. However, any subrouters created from that route inherit the original StrictSlash setting.

like image 114
c_anirudh Avatar answered Jan 02 '23 19:01

c_anirudh