【问题标题】:Handling dynamic sub-domains处理动态子域
【发布时间】:2018-11-29 20:34:12
【问题描述】:

假设我的网站是http://soccer.com,我想支持无限数量的子域,例如:

  • http://cronaldo.soccer.com
  • http://messi.soccer.com
  • http://neymar.soccer.com
  • http://muller.soccer.com
  • ...

我还想要一些保留的子域,例如:

  • http://admin.soccer.com
  • http://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,因此不清楚为什么您认为如果从未使用过它会产生任何输出。

标签: go mux


【解决方案1】:

你在正确的轨道上。为每种类型的域创建一个 http.ServeMux,并从 Mux.ServeHTTP 中的 if / else 语句中调用这些多路复用器。此外,使用 Mux 作为根处理程序。

type Mux struct {
    help, admin, sub, main *http.ServeMux
}

func (mux *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if isMainDomain(r.Host) {
        mux.main.ServeHTTP(w, r)
        return
    }
    domainParts := strings.Split(r.Host, ".")
    if domainParts[0] == "admin" {
        mux.admin.ServeHTTP(w, r)
    } else if domainParts[0] == "help" {
        mux.help.ServeHTTP(w, r)
    } else if isSubDomainValid(domainParts[0]) {
        mux.sub.ServeHTTP(w, r)
    } else {
        http.Error(w, "Not found", 404)
    }
}

func main() {
    mux := &Mux{
        help:  http.NewServeMux(),
        admin: http.NewServeMux(),
        sub:   http.NewServeMux(),
        main:  http.NewServeMux(),
    }

    mux.help.HandleFunc("/", helpHomeHandler)
    mux.admin.HandleFunc("/", adminHomeHandler)
    mux.sub.HandleFunc("/", defaultSubdomainHomeHandler)
    mux.main.HandleFunc("/", mainHomeHandler)

    http.ListenAndServe(":8080", mux) // <-- use Mux value as root handler
}

【讨论】:

  • 谢谢!我搞砸了mux。快速提问,我如何处理主域的路由? IE。对soccer.com 的请求(没有任何子域)。在哪里添加处理程序?
  • 使用另一个 http.ServeMux 并使用从子域中分离域所需的任何逻辑连接到 if / else 语句。
猜你喜欢
  • 1970-01-01
  • 2012-07-03
  • 2016-03-11
  • 2020-01-27
  • 2022-07-22
  • 2017-07-19
  • 1970-01-01
  • 2013-06-04
  • 2012-06-16
相关资源
最近更新 更多