英文:
Golang handlefunc
问题
所以我有一个奇怪的问题,其中一些路由可以工作,而其他路由则不行。我首先会展示给你我的主要函数,然后给出问题的示例。
func main() {
http.HandleFunc("/", home)
http.HandleFunc("/project", project)
http.HandleFunc("/about", about)
http.HandleFunc("/contact", contact)
http.Handle("/resources/", http.StripPrefix("/resources", http.FileServer(http.Dir("./assets"))))
err := http.ListenAndServe(":80", nil)
if err != nil {
fmt.Println("ListendAndServe doesn't work: ", err)
}
}
例如,路由"/contact/"不起作用,当我运行这段代码并访问localhost/contact时,它会将我发送到主页。然而,当我将Handlefunc中的路由更改为"/contactos",然后访问localhost/contactos时,它确实起作用。
另一个例子,"/project"现在可以工作,但当我将其更改为"/projects"时,它就不起作用了。
英文:
So I have this weird issue where some routes will work and others won't. I will first show you my main function and then give examples of what the problem is.
func main() {
http.HandleFunc("/", home)
http.HandleFunc("/project", project)
http.HandleFunc("/about", about)
http.HandleFunc("/contact", contact)
http.Handle("/resources/", http.StripPrefix("/resources", http.FileServer(http.Dir("./assets"))))
err := http.ListenAndServe(":80", nil)
if err != nil {
fmt.Println("ListendAndServe doesn't work : ", err)
}
}
For example, the route "/contact/" does not work, when I run this code and go to localhost/contact it will send me to the homepage. However when I change the route in the Handlefunc to "/contactos" and then go to localhost/contactos it does work.
Another example, "/project" works now, but when I change it to "/projects" it does not.
答案1
得分: 2
请注意,如果你注册了/project/(注意末尾的斜杠),那么/project/和/project都可以使用(带或不带斜杠)。如果你注册了/project(没有末尾的斜杠),那么只有/project可以使用,/project/将会被根处理器/匹配。
引用自http.ServeMux:
> 如果已经注册了一个子树,并且收到了一个不带末尾斜杠的子树根的请求,ServeMux会将该请求重定向到子树根(添加末尾斜杠)。 这个行为可以通过单独为不带末尾斜杠的路径注册来覆盖。例如,注册"/images/"会导致ServeMux将对"/images"的请求重定向到"/images/",除非"/images"已经单独注册。
参考相关问题:
英文:
Note that if you register /project/ (note the trailing slash), then both /project/ and /project will work (with or without trailing slash). If you register /project (without a trailing slash), then only /project will work, /project/ will be matched by the root handler /.
Quoting from http.ServeMux:
> If a subtree has been registered and a request is received naming the subtree root without its trailing slash, ServeMux redirects that request to the subtree root (adding the trailing slash). This behavior can be overridden with a separate registration for the path without the trailing slash. For example, registering "/images/" causes ServeMux to redirect a request for "/images" to "/images/", unless "/images" has been registered separately.
See related questions:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论