php实现短域名
实现短域名服务的 PHP 方案
短域名服务是将长 URL 转换为短字符串(如 example.com/abc123)的技术。以下是实现短域名的核心方法和步骤:
数据库设计
创建数据库表存储原始 URL 和短码的映射关系:
CREATE TABLE short_urls (
id INT AUTO_INCREMENT PRIMARY KEY,
original_url VARCHAR(2048) NOT NULL,
short_code VARCHAR(10) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
短码生成算法
使用哈希或自增 ID 转换为短字符串:
方法1:Base62 编码(推荐)
function generateShortCode($url) {
$hash = crc32($url . microtime());
$base62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$shortCode = '';
while ($hash > 0) {
$shortCode = $base62[$hash % 62] . $shortCode;
$hash = (int)($hash / 62);
}
return substr($shortCode, 0, 6);
}
方法2:MD5 截取
function generateShortCode($url) {
return substr(md5($url . uniqid()), 0, 6);
}
URL 缩短逻辑
处理原始 URL 并存储:
function shortenUrl($originalUrl, $pdo) {
// 验证 URL
if (!filter_var($originalUrl, FILTER_VALIDATE_URL)) {
throw new Exception("Invalid URL");
}
// 生成短码
$shortCode = generateShortCode($originalUrl);
// 存储到数据库
$stmt = $pdo->prepare("INSERT INTO short_urls (original_url, short_code) VALUES (?, ?)");
$stmt->execute([$originalUrl, $shortCode]);
return 'https://yourdomain.com/' . $shortCode;
}
重定向逻辑
通过短码跳转到原始 URL:
function redirectToOriginal($shortCode, $pdo) {
$stmt = $pdo->prepare("SELECT original_url FROM short_urls WHERE short_code = ?");
$stmt->execute([$shortCode]);
$result = $stmt->fetch();
if ($result) {
header("Location: " . $result['original_url'], true, 301);
exit;
} else {
header("HTTP/1.0 404 Not Found");
echo "URL not found";
}
}
路由处理
在入口文件(如 index.php)中添加路由:
$request = $_SERVER['REQUEST_URI'];
$path = parse_url($request, PHP_URL_PATH);
$shortCode = ltrim($path, '/');
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $path === '/shorten') {
// 处理缩短请求
$originalUrl = $_POST['url'] ?? '';
echo shortenUrl($originalUrl, $pdo);
} elseif (!empty($shortCode) && strlen($shortCode) <= 10) {
// 处理重定向
redirectToOriginal($shortCode, $pdo);
}
性能优化建议
- 使用缓存(如 Redis)存储热门短码映射
- 添加布隆过滤器防止重复生成相同 URL 的短码
- 实现过期机制自动清理长期未使用的短链接
- 对频繁访问的短链接启用 CDN 加速
安全注意事项
- 验证输入 URL 防止 XSS 攻击
- 限制短码生成频率防止滥用
- 对敏感域名添加黑名单过滤
- 使用 HTTPS 保证传输安全
完整实现需要结合具体框架(如 Laravel 或 Symfony)调整数据库和路由部分。对于高并发场景,建议采用分布式 ID 生成器替代自增 ID。







