一条长链接在技术上完全没问题,可一旦放进短信、社交媒体、海报二维码或广告投放落地页,问题就来了。字符太挤,平台可能截断,用户看着不顺眼,复制也容易出错。短网址就是在这种情况下出现的:它不是把原始 URL 物理压缩成更短的文本,而是在短码和长链之间建立了一层映射。你访问的是 abc123,背后的服务知道该把你带到哪里。

底层逻辑并不神秘。第一步,是生成一个足够短且唯一的标识。常见做法有两种:用自增 ID 再转成 Base62 字符,或者直接随机生成字母数字组合。前者可控、碰撞率低,但可能暴露数据增长;后者实现简单,可高并发时要反复处理重名。也有系统尝试用哈希算法产出短码,比如 MD5、SHA-1 这类字符串摘要,只是它们本身不一定适合直接当用户短码,因为长度、可预测性、碰撞概率和业务需求都要单独考虑。第二步,是把短码和原始 URL 存入数据库,MySQL、SQLite、PostgreSQL 都能做这件事,访问量大了还要用 Redis 这类缓存加速。第三步,是重定向:用户请求短地址时,服务端查表,再把浏览器送到真实页面。这里常用的状态码是 302,因为它表达的是临时跳转,适合短链服务随时换目标;如果是 301,永久跳转语义更强,对某些场景更合适,但链接替换和统计就会变复杂。
如果只是想理解最小闭环,Flask 加 SQLite 已经够了。下面这个例子没有登录、没有权限、没有防刷,也没有生产级高可用,它的作用是把“生成短码、存储映射、访问跳转”这条链路摆到台面上。
import sqlite3
import string
import random
from flask import Flask, request, redirect, jsonify
app = Flask(__name__)
DB_PATH = "short_url.db"
def get_conn():
return sqlite3.connect(DB_PATH)
def init_db():
conn = get_conn()
cur = conn.cursor()
cur.execute(
"""
CREATE TABLE IF NOT EXISTS urls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
original_url TEXT NOT NULL,
short_code TEXT UNIQUE NOT NULL
)
"""
)
conn.commit()
conn.close()
def generate_short_code(length=6):
chars = string.ascii_letters + string.digits
return "".join(random.choices(chars, k=length))
@app.route("/shorten", methods=["POST"])
def shorten_url():
data = request.get_json(silent=True) or {}
original_url = data.get("url")
if not original_url:
return jsonify({"error": "URL is required"}), 400
conn = get_conn()
cur = conn.cursor()
try:
cur.execute(
"SELECT short_code FROM urls WHERE original_url = ?",
(original_url,)
)
result = cur.fetchone()
if result:
short_code = result[0]
else:
while True:
short_code = generate_short_code()
cur.execute(
"SELECT 1 FROM urls WHERE short_code = ?",
(short_code,)
)
if not cur.fetchone():
cur.execute(
"INSERT INTO urls (original_url, short_code) VALUES (?, ?)",
(original_url, short_code)
)
conn.commit()
break
finally:
conn.close()
<img src="/uploads/20251015/60.png?t=1939293998" alt="" class="img-fluid" />
short_url = f"http://localhost:5000/{short_code}"
return jsonify({"short_url": short_url})
@app.route("/<short_code>")
def redirect_to_original(short_code):
conn = get_conn()
cur = conn.cursor()
cur.execute(
"SELECT original_url FROM urls WHERE short_code = ?",
(short_code,)
)
result = cur.fetchone()
conn.close()
<img src="/uploads/20251015/9.png?t=1803971707" alt="" class="img-fluid" />
if result:
return redirect(result[0])
return "URL not found", 404
if __name__ == "__main__":
init_db()
app.run(debug=True)
这个实现里,数据库表有三个字段:
id 自增,original_url 存原始地址,short_code 存短码。生成短码时,从大小写字母和数字里随机挑 6 个字符。/shorten 接收 JSON 里的 url,如果原网址以前已经被缩短过,就复用已有短码;如果是新的,就不断尝试,直到短码没被占用,再写入数据库。/<short_code> 负责根据短码查询原始地址,并用 redirect 把用户送过去;找不到就返回 404。运行起来也不复杂,命令大致是
pip install flask、python app.py,然后用下面这条请求测一次:curl -X POST -H "Content-Type: application/json" -d '{"url": "https://example.com"}' http://localhost:5000/shorten
拿到返回的短地址后,在浏览器里打开,就能看到跳转是否发生。
真实产品不会止步于这里。短网址的价值,往往藏在运营细节里。电商做活动,可能需要批量导入商品链接,一次生成上百甚至上千个短码;社群和短信营销里,链接在平台内容易被折叠、拦截或限制,跳转稳定性和备用域名就很关键;线下物料印了二维码,活动临时换页面,若后台能更新短码背后的目标地址,就不必重新印刷。面向不同用户时,短链还可以根据设备、来源或请求头,把 iOS、Android、PC 引导到不同落地页,甚至适配小程序、App 内跳转和开放 API。成熟一点的短链服务,通常还会把自定义短码、访问密码、有效期、点击统计、设备来源、地区分布、批量导入、API 接口、多语言界面和全球访问加速这些能力整合进去。对中文用户来说,免登录使用、免费或低门槛生成、批量处理、适配常见平台、随时替换目标地址,确实比单纯“缩短链接”更能解决日常痛点。
当然,功能越多,工程责任也越重。随机短码在低并发 demo 里够用,放到线上就要重新考虑容量、碰撞概率和短码长度;目标 URL 校验不能马虎,否则短链服务可能变成跳转入口,被用于钓鱼、内网探测或异常流量放大;重定向接口需要限流,统计日志需要合理留存,敏感域名要能紧急下线,缓存失效也要干净利落。如果面向全球用户,CDN、DNS、域名信誉、HTTPS 证书和跨地域访问稳定性,都会比“能不能跑通”更影响体验。

所以短网址看起来是一小段链接,实际背后是一整套取舍:短码怎么生成、映射怎么存储、跳转怎么控制、运营怎么替换、数据怎么统计、风险怎么兜住。示例代码足够帮你理解原理,真正使用或长期运营时,通常会在它的基础上继续补上自定义短码、访问统计、过期时间、API 文档、缓存、权限和安全策略。链接越短,责任未必越短;能把简单跳转做稳,往往才是这类工具最实用的地方。
अभी लॉगिन करें