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

如何在Ktor服务器中实现.htaccess的视频防盗链功能?

在Ktor中实现和.htaccess一致的音视频防盗链功能

没问题,我帮你把原来.htaccess里的防盗链逻辑转换成Ktor的实现方式,思路和原规则完全匹配,具体步骤如下:

核心逻辑回顾

你的.htaccess本质是做防盗链,核心规则拆解下来是三件事:

  • 拦截所有mp4/mp3/avi格式的文件请求
  • 只允许来自sample.com域名的Referer请求访问这些文件
  • 不符合条件的直接返回403 Forbidden,并且终止后续请求处理

Ktor具体实现

在Ktor里,我们可以通过请求管道拦截器来实现同样的判断逻辑,代码直观且易维护:

  1. 添加防盗链配置函数
    在你的Application模块代码中,新增一个专门的配置函数:

    import io.ktor.http.*
    import io.ktor.server.application.*
    import io.ktor.server.response.*
    import io.ktor.util.pipeline.*
    
    fun Application.configureHotlinkProtection() {
        // 拦截所有进入Call阶段的请求
        intercept(ApplicationCallPipeline.Call) {
            // 1. 判断请求的文件是否是目标音视频格式(不区分大小写)
            val protectedExtensions = setOf("mp4", "mp3", "avi")
            val fileExt = call.request.path()
                .substringAfterLast('.', "")
                .lowercase()
            
            if (fileExt in protectedExtensions) {
                // 2. 检查Referer头是否来自sample.com(不区分大小写)
                val referer = call.request.headers[HttpHeaders.Referer]
                val isAllowed = referer?.startsWith("http://sample.com/", ignoreCase = true) ?: false
    
                if (!isAllowed) {
                    // 3. 不符合条件,返回403并终止请求
                    call.respond(HttpStatusCode.Forbidden)
                    finish()
                    return@intercept
                }
            }
            // 符合条件的请求,继续走后续的路由/静态资源处理逻辑
        }
    }
    
  2. 启用防盗链配置
    在你的主模块函数里调用这个配置,确保它在其他路由配置前执行:

    fun Application.module() {
        configureHotlinkProtection()
        // 这里放你其他的配置,比如静态资源路由、API路由等
    }
    

细节对应原.htaccess规则

  • RewriteCond %{REQUEST_URI} \.(mp4|mp3|avi)$ [NC] → 对应代码里的fileExt in protectedExtensions,用lowercase()实现不区分大小写的匹配
  • RewriteCond %{HTTP_REFERER} !^http://sample.com/.*$ [NC] → 对应!isAllowed的判断,startsWith配合ignoreCase实现前缀匹配和不区分大小写的效果
  • RewriteRule ^.* - [F,L] → 对应call.respond(HttpStatusCode.Forbidden)和finish(),返回403状态码并终止请求处理流程

测试建议

  • 直接在浏览器输入音视频文件的URL,应该会得到403禁止访问的响应
  • 从sample.com的页面里嵌入播放该文件,请求应该能正常加载资源

内容的提问来源于stack exchange,提问作者Hasan A Yousef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:22:12