rs-short 3.3.1 介绍与选型指南

rs-short 3.3.1(git.42l.fr/42l/rs-short,Rust/Actix 轻量短链服务)全景介绍与选型:Rust 实现纠偏、无预构建镜像与 Docker 形态强制 PostgreSQL、无 CLI/API 的 URL 即接口形态、钓鱼检测/验证码/黑名单实测特性,与 Kutt、Shlink、YOURLS、Chhoto URL 五向量化对比。

rs-shortrs-short短链接自托管Docker2026/11/02

rs-short 3.3.1 介绍与选型指南

本文所有数据与结论来自 2026-11-02 联网实查与真实环境部署实测(完整取证记录:/opt/data/quzuo/tmp/rs-short/evidence.md)。rs-short 在本平台以 Docker Compose + PostgreSQL 形态完成部署,短链创建→跳转→点击统计→钓鱼标记→删除全闭环走通。

一、快速结论

rs-short 是 La Contre-Voie(法国数字自主协会) 开发维护的轻量级自托管短链接服务,官方仓库托管在自建 Gitea 实例 git.42l.fr/42l/rs-short(GitHub 上的 lacontrevoie/rs-short 仅为代码镜像)。它用 Rust(Actix-web 框架) 编写,主打极简与隐私:约 1000 行代码、运行内存 5–20MB、无 JS 无 CSS 框架、不记录用户 IP,同时自带反垃圾验证码、钓鱼链接主动检测与正则黑名单——这些是同类极简短链工具(如 Chhoto URL)普遍不具备的治理能力。

适用:隐私导向的个人/小组织公开短链服务、需要"反钓鱼治理面"的公益/教育类站点。不适用:需要营销统计、API 自动化批量建链、多域名运营的场景(选 Shlink/Kutt)。

二、基本信息(实查)

项目内容
官方仓库https://git.42l.fr/42l/rs-short(自建 Gitea,主仓)
代码镜像https://github.com/lacontrevoie/rs-short(0 star,纯镜像,无 GitHub Releases)
官方实例https://s.42l.fr/
最新稳定版3.3.1(tag 提交 2026-02-18;master 最后推送 2026-06-03)
语言 / 框架Rust(Actix-web 4.12 + Diesel 2.3 + Askama 0.13 服务端模板)
LicenseMPL-2.0
分类awesome-selfhosted → URL Shorteners(Docker/Rust 平台标签)
维护方Neil(为 La Contre-Voie 协会维护),接受翻译/主题/防护策略贡献

⚠️ 实查纠偏三条:

  1. rs-short 不是 Go 项目——名字里的 "rs" 即 Rust 缩写,常被误认为 Rust 版 Shlink 或某 Go 服务,选型时以官方仓库为准;
  2. 无官方预构建 Docker 镜像(Docker Hub 无 rs-short 官方命名空间镜像,ghcr 不存在)。官方 Docker 路径是仓库自带 Dockerfile 本地构建,且该 Dockerfile 硬编码 --no-default-features --features postgres,即官方容器形态强制 PostgreSQL;SQLite/MySQL 只在源码 cargo build 时可作为 feature 选择;
  3. tag 3.3.1 的 Cargo.toml 内 version 字段仍写 3.2.1(版本号未随 tag 同步),以 git tag 为准。

三、架构与技术特点

3.1 组成结构

rs-short 单二进制
├── Actix-web HTTP 服务(监听 config.toml: listening_address)
├── Askama 服务端模板(light/dark 主题,零前端 JS)
├── Diesel + r2d2 连接池(SQLite | PostgreSQL | MySQL 三选一,编译期 feature 决定)
│   └── 内嵌 migrations 启动时自动执行(embed_migrations!)
├── 会话 Cookie(AES 加密签名,cookie_key;仅存验证码答案,30 分钟时效)
├── 反垃圾模块 spam.rs(captcha 图像生成、可疑点击 RAM 监视器)
└── 策略文件 lists.toml(names/urls 双 allowlist/blocklist,正则 + 类别)

3.2 设计取向(README 实测佐证)

  • 极简:约 1000 行代码(含 20% 注释)、#![forbid(unsafe_code)] 全库禁 unsafe、无跟踪功能;
  • 隐私:数据库 links 表实测列为 id, url_from, url_to, key(bytea), time, clicks, phishing——没有任何 IP/UA 字段;可疑活动监测只在 RAM 中临时存 IP,重启即清;
  • 抗滥用三件套:创建链接需图像验证码(难度 0–5 可调);内置 100+ 常见短链域名黑名单(bit.ly、t.co、tinyurl 等,防"链式缩短");点击异常(12h 窗口内多 IP 访问)控制台告警 + 管理员一键标记钓鱼;
  • 容错:内置缓存层,数据库锁定时仍能服务跳转(SQLite 形态的意义所在);
  • 本地化:内置 en/fr/hr/oc 四语言,实测 Accept-Language: fr 即返回法语页面。

3.3 操作面形态(重要)

rs-short 没有 CLI 子命令、没有 REST API、没有 API Key——二进制启动后只做一件事:按 config.toml 监听 HTTP。全部管理动作通过"URL 即接口"完成(详见本专栏 D1 篇):

动作端点凭据
创建短链POST /(表单 + 验证码)浏览器会话
跳转GET /<short>无
查看统计/删除GET /<short>/admin/<admin_key>建链时返回的私有 key
标记钓鱼GET /<short>/phishing/<phishing_password>服务端管理密码

这意味着它无法无人值守批量建链(验证码是刻意设计),是"人用服务"而非"平台组件"。

四、实测功能速览(3.3.1,Docker + PostgreSQL)

以下均为本次真实环境验证结果:

  • 创建 quzuo-doc → https://quzuo.net/:POST / 通过验证码后返回 303,重定向到管理页并给出 admin 链接(含 22 字符 base64url 随机 key);
  • 跳转:GET /quzuo-doc → **303 → https://quzuo.net/**,点击计数 +1(26 连击后 DB clicks=27);
  • 管理页显示 Click count: N 与删除链接;GET /<short>/delete/<key> 删除成功(200,DB 行消失);
  • 钓鱼治理:GET /<short>/phishing/<密码> 标记后,受害者访问该短链得到 410 反诈提示页("You have clicked on a fraudulent link…");被标记链接的普通删除通道被禁用(401);
  • 黑名单:缩短 bit.ly 链接被 403 拒绝并提示"Please do not chain shortened links…";
  • 边界行为实测:重复创建 403、验证码错误 400、不存在的短链 404、ftp:///gemini: 等 20+ 非 http 协议允许缩短(白名单设计);
  • 已知缺陷(3.3.1):① lists.toml 的 [names] blocklist 字段实际要求 _category(带下划线),与文件注释不符,写错直接启动 panic;② names 黑名单命中后用户端文案缺翻译键(显示 "Missing translation");③ instance_hostname 带端口时自链接防护失效。详见配置篇 C1。

五、量化选型对比

与本平台已收官实测的四个短链组件横向对比(rs-short 数据为 2026-11-02 实查+实测;其余为各组件选型篇实测结论,star 数为 2026-10/11 GitHub API 口径):

维度rs-short 3.3.1Kutt 3.2.6Shlink 5.1.8YOURLS 1.10.6Chhoto URL 7.10.3
技术栈Rust / Actix-webNode.js + SveltePHP (Swoole)PHPRust 单二进制
LicenseMPL-2.0MITMITMITMIT
Stars(GitHub 主仓)主仓在自建 Gitea,镜像 0★11188★5398★12295★996★
存储SQLite/PG/MySQL(Docker 形态仅 PG)SQLite/PG/MySQL + 可选 RedisPG/MySQL/SQLiteMySQL 必需SQLite
内存占用5–20MB100MB+100MB+PHP-FPM 计~10MB
管理界面服务端模板(无 JS)Svelte SPA独立 PWA 客户端内置后台内置极简后台
API / CLI无(仅 HTTP 表单端点)REST + 双认证REST + CLI 生态签名 API + 插件简单 API
验证码✅ 图像 captcha(0–5 难度)❌插件
钓鱼检测/标记✅ 内置主动检测+反诈页❌❌插件❌
域名黑名单✅ 内置 100+ 正则规则❌❌
点击统计仅总数(不存 IP/UA)浏览器/OS/国家/referrer营销级最细基础基础
自定义短链名✅✅✅✅✅
密码保护/有效期❌✅✅插件❌
官方预构建镜像❌(需自建)✅✅✅(社区)✅
部署复杂度中(compose 构建+PG)低中中(PHP 栈)最低
定位隐私/反钓鱼公益向功能全自托管营销运营向插件生态极简跳转

选型建议:

  • 对外公开提供短链、担心被钓鱼滥用,且重视访客隐私 → rs-short(同类中唯一内置钓鱼治理面);
  • 要"功能全 + 界面现代 + 单容器起步" → Kutt;
  • 要"营销级统计 + 多域名池 + CLI 自动化" → Shlink;
  • 已有 PHP/MySQL 栈、要插件生态 → YOURLS;
  • 只要极简跳转、资源占用优先 → Chhoto URL。

互链:《Kutt 3.2.6 介绍与选型指南》、《Shlink 5.1.8 介绍与选型指南》、《YOURLS 1.10.6 介绍与选型指南》、《Chhoto URL 介绍与选型指南》

六、上手路径

  1. 本专栏 B2《rs-short 3.3.1 Docker Compose 部署指南》:clone 源码 → 官方 Dockerfile 构建 → compose 编排 PostgreSQL → 创建/跳转/删除全闭环实测;
  2. C1《rs-short 3.3.1 配置参数详解》:config.toml 全参数 + lists.toml 名单语法(含 _category 陷阱)+ 改参→重启→验证闭环;
  3. D1《rs-short 3.3.1 命令与 HTTP 端点详解》:形态适配篇——rs-short 无 CLI 子命令,本文覆盖二进制运行方式、全部 HTTP 端点 curl 实测与 psql/sqlite3 数据管理。

七、社区与维护评估

  • 活跃度:master 最近推送 2026-06-03;3.3.x 系列 2026-02 发布;PR 由贡献者(如 uruma)持续提交依赖更新,维护未停摆但节奏平缓;
  • 生态位:收录于 awesome-selfhosted URL Shorteners 分类;官方实例 s.42l.fr 长期公开运营,是功能可信度的活体证明;
  • 风险点:主仓在自建 Gitea(git.42l.fr),可用性依赖 La Contre-Voie 协会基础设施;GitHub 镜像无 issue/release 流程;无预构建镜像意味着升级需自备构建环境(Rust 工具链或 docker build);
  • 贡献方向(README 自述):翻译、CSS 主题、更强反垃圾、验证码可关闭开关、无障碍实验——侧面印证当前验证码不可禁用是有意取舍。

八、参考链接

rs-short 3.3.1 介绍与选型指南 - Quzuo