【发布时间】:2017-09-22 04:43:23
【问题描述】:
我正在使用 Go 开发一个网站。服务器限制要求我使用 CGI。当我使用 http.ListenAndServe() (在下面注释掉)在本地测试以下代码时,会根据请求的地址正确调用各种处理程序。但是,如果我改用 cgi.Serve(),则会为所有地址执行默认路由器(即,始终执行“/”的处理程序)。如有任何有关如何解决此问题的线索,我将不胜感激。
编辑:这是我能想到的最简单的测试用例来显示问题:
//=============简化代码================//
package main
import (
"fmt"
"net/http"
"net/http/cgi"
)
func defaultHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Default")
}
func otherHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Other")
}
func main() {
http.HandleFunc("/other", otherHandler)
http.HandleFunc("/", defaultHandler)
/*
//Works fine
err := http.ListenAndServe(":8090", nil)
if err != nil {
panic(err)
}
*/
//Always fires defaultHandler no matter the address requested
err := cgi.Serve(nil)
if err != nil {
panic(err)
}
}
//=============来自原始帖子的代码===================//
package main
import (
"fmt"
"net/http"
"net/http/cgi"
"net/url"
"os"
"github.com/go-cas/cas"
)
func logoutHandler(w http.ResponseWriter, r *http.Request) {
cas.RedirectToLogout(w, r)
}
func calendarHandler(w http.ResponseWriter, r *http.Request) {
if !cas.IsAuthenticated(r) {
cas.RedirectToLogin(w, r)
}
fmt.Fprintf(w, "Calendar for %s", cas.Username(r))
}
func defaultHandler(w http.ResponseWriter, r *http.Request) {
if !cas.IsAuthenticated(r) {
cas.RedirectToLogin(w, r)
}
fmt.Fprintf(w, "Hi there %s!", cas.Username(r))
}
func main() {
u, _ := url.Parse("https://www.examplecasserver.com")
client := cas.NewClient(&cas.Options{
URL: u,
})
http.Handle("/logout", client.HandleFunc(logoutHandler))
http.Handle("/calendar", client.HandleFunc(calendarHandler))
http.Handle("/", client.HandleFunc(defaultHandler))
/*
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
*/
err := cgi.Serve(nil)
if err != nil {
panic(err)
}
}
【问题讨论】:
-
你试过去掉cas客户端中间件的使用吗?也许首先尝试使用最简单的处理程序,而不需要 client.HandleFunc 或任何 cas.xxx 调用。您可能会发现 cas 正在重定向到 /。
-
是的。我将编辑帖子以添加我能想到的最简单的测试用例。