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-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 服务端模板) |
| License | MPL-2.0 |
| 分类 | awesome-selfhosted → URL Shorteners(Docker/Rust 平台标签) |
| 维护方 | Neil(为 La Contre-Voie 协会维护),接受翻译/主题/防护策略贡献 |
⚠️ 实查纠偏三条:
- rs-short 不是 Go 项目——名字里的 "rs" 即 Rust 缩写,常被误认为 Rust 版 Shlink 或某 Go 服务,选型时以官方仓库为准;
- 无官方预构建 Docker 镜像(Docker Hub 无
rs-short官方命名空间镜像,ghcr 不存在)。官方 Docker 路径是仓库自带Dockerfile本地构建,且该 Dockerfile 硬编码--no-default-features --features postgres,即官方容器形态强制 PostgreSQL;SQLite/MySQL 只在源码cargo build时可作为 feature 选择; - 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 连击后 DBclicks=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.1 | Kutt 3.2.6 | Shlink 5.1.8 | YOURLS 1.10.6 | Chhoto URL 7.10.3 |
|---|---|---|---|---|---|
| 技术栈 | Rust / Actix-web | Node.js + Svelte | PHP (Swoole) | PHP | Rust 单二进制 |
| License | MPL-2.0 | MIT | MIT | MIT | MIT |
| Stars(GitHub 主仓) | 主仓在自建 Gitea,镜像 0★ | 11188★ | 5398★ | 12295★ | 996★ |
| 存储 | SQLite/PG/MySQL(Docker 形态仅 PG) | SQLite/PG/MySQL + 可选 Redis | PG/MySQL/SQLite | MySQL 必需 | SQLite |
| 内存占用 | 5–20MB | 100MB+ | 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 介绍与选型指南》
六、上手路径
- 本专栏 B2《rs-short 3.3.1 Docker Compose 部署指南》:clone 源码 → 官方 Dockerfile 构建 → compose 编排 PostgreSQL → 创建/跳转/删除全闭环实测;
- C1《rs-short 3.3.1 配置参数详解》:config.toml 全参数 + lists.toml 名单语法(含
_category陷阱)+ 改参→重启→验证闭环; - 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 主题、更强反垃圾、验证码可关闭开关、无障碍实验——侧面印证当前验证码不可禁用是有意取舍。
八、参考链接
- 官方仓库:https://git.42l.fr/42l/rs-short
- GitHub 镜像:https://github.com/lacontrevoie/rs-short
- 官方实例:https://s.42l.fr/
- awesome-selfhosted 收录页:https://awesome-selfhosted.net/tags/url-shorteners.html
- nginx/systemd 集成 wiki:https://git.42l.fr/42l/rs-short/wiki/Integration-with-nginx-%2F-systemd
- 开发方协会:https://lacontrevoie.fr/en/