Iris 具有已知最简单的形式,用于将子域注册到单个应用程序。 当然,你也可以在生产中使用 nginx 或 caddy 进行管理。
子域分为两类:**静态** 和 **动态/通配符**.
* 静态 : 当你知道子域名的时候,即:` analytics.mydomain.com`
* 通配符 : 当你不知道子域名,但是你知道它在特定的子域名前面,或者你知道根域名,即 : `user_created.mydomain.com`, `otheruser.mydomain.com `如同`username.github.io` 一样。
我们使用 `iris.Party` 或者 `iris.Application` 的 `Subdomain` 和 `WildcardSubdomain` 方法去注册子域名。
`Subdomain` 方法返回一个新的 `Party` ,该分组负责注册路由到特定的子域名。
与常规 `Party` 的唯一区别在于, 如果从子路由分组调用,则子域将被添加到路径之前,而不是被添加到路径中。 所以,如果 `app.Subdomain("admin").Subdomain("panel")` 则结果为:
`"panel.admin."`。
```
Subdomain(subdomain string, middleware ...Handler) Party
```
`WildcardSubdomain` 方法返回一个新的 `Party` ,它负责将路由注册到动态通配符子域。动态子域是可以处理任何子域请求的子域。动态子域是可以处理任何子域请求的子域。服务器将接受任何子域(如果未找到静态子域),它将搜索并执行此`Party`的处理程序。
```
WildcardSubdomain(middleware ...Handler) Party
```
示例代码:
```
// [app := iris.New...]
admin := app.Subdomain("admin")
// admin.mydomain.com
admin.Get("/", func(ctx iris.Context) {
ctx.Writef("INDEX FROM admin.mydomain.com")
})
// admin.mydomain.com/hey
admin.Get("/hey", func(ctx iris.Context) {
ctx.Writef("HEY FROM admin.mydomain.com/hey")
})
// [这里的其他路线...]
app.Run(iris.Addr("mydomain.com:80"))
```
对于本地开发,你需要去编辑你的 hosts, 例如在 windows 操作系统中打开 `C:\Windows\System32\Drivers\etc\hosts `文件并且加入一下内容:
```
127.0.0.1 mydomain.com
127.0.0.1 admin.mydomain.com
```
为了证明子域可以像任何其他常规 `Party` 一样工作,你还可以使用以下替代方法注册子域:
```
adminSubdomain:= app.Party("admin.")
// 或者
adminAnalayticsSubdomain := app.Party("admin.analytics.")
// 或动态的:
anySubdomain := app.Party("*.")
```
还有一个 ` iris.Application` 方法,它也可以为子域名注册全局重定向规则。
`SubdomainRedirect` 设置 (或在使用多次的情况下添加) 一个路由器包装程序,该路由器包装程序在执行以下操作之前,将(子)域(状态永久移动)尽可能快地重定向到另一个子域或根域。
它接收两个参数,它们分别是 `from` 和 `to/target` 位置, 'from' 也可以是通配符子域 就如同 (app.WildcardSubdomain()) 'to' 是不允许作为通配符一样明显,相反的, 'from' 也可以作为根域名(程序) 当 'to' 不是根域名的时候。
```
SubdomainRedirect(from, to Party) Party
```
# 使用方法
```
www := app.Subdomain("www")
app.SubdomainRedirect(app, www)
```
上面的代码会将所有 http(s)://mydomain.com/%anypath% 重定向到 http(s)://www.mydomain.com/%anypath%.
使用子域时, `Context` 提供了四种主要方法,这些方法可能对你有所帮助。
```
// Host 返回当前网址的主机部分。
Host() string
// Subdomain 返回此请求的子域(如果有)。
// 请注意,这是一种快速方法,无法涵盖所有情况。
Subdomain() (subdomain string)
// IsWWW 如果当前子域(如果有)是www,则返回true。
IsWWW() bool
// FullRqeuestURI 返回完整的URI,
// 包括方案,主机和相对的请求路径/资源。
FullRequestURI() string
```
# 使用方法
```
func info(ctx iris.Context) {
method := ctx.Method()
subdomain := ctx.Subdomain()
path := ctx.Path()
ctx.Writef("\nInfo\n\n")
ctx.Writef("Method: %s\nSubdomain: %s\nPath: %s", method, subdomain, path)
}
```