如何根据主机只公开一些路由

How to expose only some routes depending on host

我有一个 Vapor 应用程序需要通过 HTTPS 进行身份验证,但也需要通过 HTTP 接收未经身份验证的 PUT 请求。

我可以根据服务器的主机名或身份验证类型来条件化我的路由定义吗?我如何从服务器捕获该信息?

如果您使用命令行参数 --hostname 启动 vapor 的不同实例,您可以将此代码放入 configure.swift,然后根据主机的需要包含不同的路由。如果在错误的主机上尝试无效路由,您将收到 404。

if let index = env.arguments.index(of: "--hostname")
{
    if env.arguments.count > index
    {
        let hostname = env.arguments[index+1]
        if hostname == "hostA"
        {
             // load routes
        }
        else
        {
             // load other routes
        }
    }
}

另一种方法是使用自定义 Middleware。像这样的东西可以检查请求中调用的主机名,并且可以重定向禁止的路由:

struct HostSpecificMiddleware:Middleware
{
    func respond( to request: Request, chainingTo next: Responder ) throws -> Future<Response>
    {
        let host = request.http.headers.filter{ (arg) in let (name, _) = arg; return name == "Host" }[0]
        if host.1 == "hostA:8080"
        {
            if request.http.url.path == "routeA"
            {
                throw Abort.redirect(to:"routeNotAllowed")
            }
        }
        return try next.respond(to: request)
    }
}

然后您可以使用以下方法将中间件配置到 configure.swift 中的路由中:

let soMW = HostSpecificMiddleware()
let users = router.grouped(uriUsers).grouped(soMW)

第二种方法更加灵活。