域名转短域名PHP实现
短域名服务的基本原理
短域名服务通过将长URL映射到更短的唯一字符串实现跳转。核心步骤包括生成短码、存储原始URL与短码的对应关系、通过短码重定向到原始URL。
生成短码的常见方法
- Base62编码:将自增ID或MD5哈希值转换为包含大小写字母和数字的字符串。
- 随机字符串:生成指定长度的随机字符组合,需检查唯一性。
- 哈希算法截取:对原始URL计算哈希(如MD5),取前N位作为短码。
Base62编码示例代码
function base62_encode($num) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$base = strlen($chars);
$str = '';
while ($num > 0) {
$str = $chars[$num % $base] . $str;
$num = floor($num / $base);
}
return $str;
}
数据库设计
存储短码与原始URL的映射关系,建议表结构:
CREATE TABLE short_urls (
id INT AUTO_INCREMENT PRIMARY KEY,
short_code VARCHAR(10) UNIQUE,
original_url TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
完整PHP实现流程
-
接收长URL并验证
$originalUrl = $_POST['url'] ?? ''; if (!filter_var($originalUrl, FILTER_VALIDATE_URL)) { die('Invalid URL'); } -
生成短码并存储
// 生成短码(示例使用ID+Base62) $stmt = $pdo->prepare("INSERT INTO short_urls (original_url) VALUES (?)"); $stmt->execute([$originalUrl]); $id = $pdo->lastInsertId(); $shortCode = base62_encode($id);
// 更新短码到数据库 $stmt = $pdo->prepare("UPDATE short_urls SET short_code = ? WHERE id = ?"); $stmt->execute([$shortCode, $id]);
3. 重定向逻辑
```php
// 从URL中解析短码(如:https://short.com/abc123 → abc123)
$shortCode = trim($_SERVER['REQUEST_URI'], '/');
// 查询原始URL并重定向
$stmt = $pdo->prepare("SELECT original_url FROM short_urls WHERE short_code = ?");
$stmt->execute([$shortCode]);
$url = $stmt->fetchColumn();
if ($url) {
header("Location: $url", true, 301);
exit;
} else {
http_response_code(404);
echo 'URL not found';
}
性能优化建议
- 使用缓存(如Redis)存储高频访问的短码映射。
- 短码长度建议6-8字符,平衡唯一性与存储效率。
- 添加防重复机制,避免同一URL生成多个短码。
安全注意事项
- 过滤输入URL防止XSS或SQL注入。
- 限制API调用频率防止滥用。
- 对敏感URL(如支付链接)添加访问权限控制。







