【发布时间】:2018-11-29 20:34:12
【问题描述】:
假设我的网站是http://soccer.com,我想支持无限数量的子域,例如:
http://cronaldo.soccer.comhttp://messi.soccer.comhttp://neymar.soccer.comhttp://muller.soccer.com- ...
我还想要一些保留的子域,例如:
http://admin.soccer.comhttp://help.soccer.com- ...
虽然玩家的子域将由相同的逻辑处理,但保留的子域不会。所以我需要 2 个路由还是 2 个路由器?
这是我所拥有的:
package main
import (
"fmt"
"net/http"
"log"
"html/template"
"strings"
)
type Mux struct {
http.Handler
}
func (mux Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
domainParts := strings.Split(r.Host, ".")
fmt.Println("Here: " + domainParts[0])
if domainParts[0] == "admin" {
// assign route?
mux.ServeHTTP(w, r)
} else if domainParts[0] == "help" {
// assign route?
mux.ServeHTTP(w, r)
} else if isSubDomainValid(domainParts[0]) {
// assign route for player page?
mux.ServeHTTP(w, r)
} else {
// Handle 404
http.Error(w, "Not found", 404)
}
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", HomeHandler)
http.ListenAndServe(":8080", mux)
}
func HomeHandler(w http.ResponseWriter, r *http.Request) {
t, err := template.ParseFiles("index.html")
if err != nil {
log.Print("template parsing error: ", err)
}
err = t.Execute(w, nil)
if err != nil {
log.Print("template executing error: ", err)
}
}
但我认为我做的不对。
fmt.Println("Here: " + domainParts[0]) 从未出现,这让我相信从未调用过ServeHTTP()。
我只是 Go 的初学者,所以我可能会遗漏一些概念
谢谢
【问题讨论】:
-
你还没有定义
handler,在这个例子中你根本没有使用你的Mux类型。 -
你在正确的轨道上。为每种域定义 http.Handler 并从 Mux.ServeHTTP 中的 if / else 语句调用这些处理程序。此外,使用 Mux 作为根处理程序。现在完全不用了。
-
@JimB 我现在添加了处理程序。它现在只是输出一个 html 文件。 @ThunderCat 你的意思是这样的:
mux.HandleFunc("/", AdminHandler)例如“admin”域?但是我认为它甚至没有调用ServeHTTP关于没有在root中使用mux,它不是在处理主域的索引请求吗? -
@Cornwell:您仍然从未在代码中使用
Mux,因此不清楚为什么您认为如果从未使用过它会产生任何输出。