短链接还原本质是数据库查询而非解密,需用短码查original_url字段;code字段须设UNIQUE索引、VARCHAR(16)类型;PHP需过滤输入、返回404、校验URL协议;Redis缓存须设TTL与穿透防护。
短链接本身不包含原始 URL 的加密信息,它只是一个映射 ID。所谓“还原”,本质就是用短码(比如 abc123)去数据库里查对应的 original_url 字段。不存在“解密算法”这回事——如果你看到别人用 base64 或异或还原,那只是他们把原始 URL 编码后存进短码,属于非常规且不推荐的做法。
7fKx9m),和原始 URL 无数学关系SELECT original_url FROM short_urls WHERE code = ?
关键不在 PHP,而在 MySQL 索引是否生效。常见错误是只对 code 建普通索引,但没设为唯一、没加长度限制,导致查询走全表扫描。
code 字段必须设为 UNIQUE,避免重复插入和歧义VARCHAR(16)(够存 6~8 位 Base62 码),不要用 TEXT 或过长 VARCHAR
ALTER TABLE short_urls ADD UNIQUE INDEX idx_code (code);
created_at 单独建索引,别和 code 组合看似简单的一行 $pdo->prepare("SELECT ...")->execute([$code]),实际容易出错。
$_GET['s'] 拼 SQL?立刻中招。只允许字母、数字、-、_:$code = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['s'] ?? '');if (!$row = $stmt->fetch()) { http_response_code(404); exit('Not found'); }
parse_url($url, PHP_URL_SCHEME) 是否为 http 或 https
缓存本意是减少 DB 查询,但如果每次请求都连 Redis、又没设好过期或穿透保护,性能可能比直连 MySQL 还差。
立即学习“PHP免费学习笔记(深入)”;
short:abc123,别拼成 cache_short_abc123 这种难维护的NULL 或 "MISS")并设短 TTL(如 60 秒)code 是不是被正则砍掉了一半。