私はGoを使用してWebサイトで作業しています。サーバーの制約により、CGIを使用する必要があります。 http.ListenAndServe()(以下にコメントアウト)を使用して次のコードをローカルでテストすると、要求されたアドレスに応じてさまざまなハンドラが正しく呼び出されます。しかし、代わりにcgi.Serve()を使用すると、デフォルトのルータがすべてのアドレスに対して実行されます(つまり、 "/"のハンドラは常に実行されます)。問題を解決する方法についての手がかりをいただければ幸いです。Webアドレスルーティングはhttp.ListenAndServeで正常に動作しますが、cgi.Serve()で失敗します
EDITは:========
// ============= SIMPLIFIED CODE:ここで私は、問題を示すことを考えることができる最も簡単なテストケースであります======== //
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呼び出しを使わずに、最も簡単なハンドラで試してみてください。あなたは/にリダイレクトされているかもしれません。 –
はい。投稿を編集して、私が考えることができる最も簡単なテストケースを追加します。 – Brent