You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KTor服务器未定义路由处理及未知请求IP记录方法咨询

KTor捕获未定义路由请求并记录IP

默认行为

当请求未定义的HTTP路由(如/welcome)时,KTor会默认返回404 Not Found响应;对于未定义的WebSocket路径,服务器会直接拒绝连接。

捕获未定义路由的方法

可以通过在所有路由最后添加一个匹配任意路径的通用路由来捕获所有未匹配到的请求——因为KTor是按路由定义顺序进行匹配的,所以这个通用路由必须放在最后,避免干扰正常路由的匹配逻辑。

捕获HTTP未定义路由

修改你的路由代码,在现有路由的末尾添加一个匹配所有HTTP方法和路径的路由,示例如下:

routing {
    webSocket("/connect/{userid}") {
        // 你的WebSocket业务逻辑
    }

    post("/hello") {
        // 你的POST请求业务逻辑
    }

    // 捕获所有未匹配的HTTP请求
    route("*") {
        handle {
            val remoteIp = call.request.origin.remoteAddress.toString()
            // 记录IP,可打印到日志或写入文件,适配fail2ban读取
            println("未定义路由访问,IP: $remoteIp,请求路径: ${call.request.path()}")
            // 保持默认的404响应行为
            call.respond(HttpStatusCode.NotFound)
        }
    }
}

捕获未定义的WebSocket请求

如果需要捕获未匹配的WebSocket请求,可以单独添加一个匹配任意路径的webSocket路由,同样放在所有WebSocket路由的最后:

routing {
    webSocket("/connect/{userid}") {
        // 你的WebSocket业务逻辑
    }

    // 捕获所有未匹配的WebSocket请求
    webSocket("*") {
        val remoteIp = call.request.origin.remoteAddress.toString()
        println("未定义WebSocket路径访问,IP: $remoteIp,请求路径: ${call.request.path()}")
        // 拒绝连接并返回原因
        close(CloseReason(CloseReason.Codes.NORMAL, "未定义的WebSocket路径"))
    }

    post("/hello") {
        // 你的POST请求业务逻辑
    }

    // 捕获所有未匹配的HTTP请求
    route("*") {
        handle {
            val remoteIp = call.request.origin.remoteAddress.toString()
            println("未定义路由访问,IP: $remoteIp,请求路径: ${call.request.path()}")
            call.respond(HttpStatusCode.NotFound)
        }
    }
}

关键注意事项

  • 路由顺序:通用路由必须放在所有具体路由的最后,否则会优先匹配,导致正常路由无法被访问。
  • 日志适配:将IP记录到指定日志文件中,即可配合fail2ban的规则完成自动封禁操作。

内容的提问来源于stack exchange,提问作者Cool_Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:12:15