如何在Ktor服务器中实现.htaccess的视频防盗链功能?
在Ktor中实现和.htaccess一致的音视频防盗链功能
没问题,我帮你把原来.htaccess里的防盗链逻辑转换成Ktor的实现方式,思路和原规则完全匹配,具体步骤如下:
核心逻辑回顾
你的.htaccess本质是做防盗链,核心规则拆解下来是三件事:
- 拦截所有mp4/mp3/avi格式的文件请求
- 只允许来自
sample.com域名的Referer请求访问这些文件 - 不符合条件的直接返回403 Forbidden,并且终止后续请求处理
Ktor具体实现
在Ktor里,我们可以通过请求管道拦截器来实现同样的判断逻辑,代码直观且易维护:
添加防盗链配置函数
在你的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 } } // 符合条件的请求,继续走后续的路由/静态资源处理逻辑 } }启用防盗链配置
在你的主模块函数里调用这个配置,确保它在其他路由配置前执行: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
相关产品推荐
相关产品推荐

