Gorilla/Mux服务器路径含连续斜杠返回404问题求助
Gorilla Mux 路由适配问题:支持空路径参数的请求
我用Gorilla Mux编写了以下Web服务器代码:
package main import ( "fmt" "log" "net/http" "github.com/gorilla/mux" ) func FooHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) pathVal := vars["item"] fmt.Printf("\n item :: %s \n", pathVal) w.Write([]byte("Gorilla!\n")) } func main() { router := mux.NewRouter() routes := router.PathPrefix("/{item}").Subrouter() routes.Methods(http.MethodGet). Path("/foo"). HandlerFunc(FooHandler) log.Fatal(http.ListenAndServe(":8000", router)) }
当前正常场景:向127.0.0.1:8000/itemvalue/foo发送请求时,能正常进入FooHandler,且pathVal可获取到正确的itemvalue值。
需求:希望127.0.0.1:8000//foo这类请求(URL中item位置为空字符串,存在连续斜杠)也能正常工作——请求进入FooHandler,且pathVal为空字符串。但目前这类请求返回404 page not found,无法进入处理函数。
我尝试过修改路径前缀为routes := router.PathPrefix("/{item:^$|.+}").Subrouter(),期望正则匹配空字符串或任意字符串,但仍然出现404错误。
解决方法
问题根源有两点:
- Gorilla Mux默认会清理路径中的连续斜杠,把
//foo处理成/foo,导致无法匹配带空参数的路由规则; - 默认的
{item}匹配规则仅匹配非空路径段,不支持空字符串。
按以下步骤修改代码即可解决:
- 初始化路由时开启
SkipClean选项,禁止mux清理路径中的连续斜杠:
router := mux.NewRouter().SkipClean(true)
- 修改
PathPrefix的匹配规则,让{item}可以匹配空字符串或任意字符:
routes := router.PathPrefix("/{item:.*}").Subrouter()
修改后的完整代码:
package main import ( "fmt" "log" "net/http" "github.com/gorilla/mux" ) func FooHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) pathVal := vars["item"] fmt.Printf("\n item :: '%s' \n", pathVal) // 带引号打印,方便确认空字符串 w.Write([]byte("Gorilla!\n")) } func main() { router := mux.NewRouter().SkipClean(true) // 禁用路径清理 routes := router.PathPrefix("/{item:.*}").Subrouter() // 支持空字符串匹配 routes.Methods(http.MethodGet). Path("/foo"). HandlerFunc(FooHandler) log.Fatal(http.ListenAndServe(":8000", router)) }
验证效果
- 请求
127.0.0.1:8000/itemvalue/foo:pathVal为itemvalue,正常响应; - 请求
127.0.0.1:8000//foo:pathVal为空字符串,正常进入FooHandler并返回响应。
内容的提问来源于stack exchange,提问作者TypeAny Word
相关产品推荐
相关产品推荐

