英文:
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:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论