php实现短网址
PHP实现短网址的方法
使用哈希算法生成短码
通过MD5或CRC32等哈希算法将长网址转换为固定长度的短码。MD5生成32位字符串,可截取前6-8位作为短码。
function generateShortCode($url) {
$hash = md5($url);
return substr($hash, 0, 6); // 取前6位
}
自增ID转Base62编码
利用数据库自增ID,通过Base62编码(0-9,a-z,A-Z)转换为短字符串。比Base64更友好,不含特殊字符。
function idToShortCode($id) {
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$code = '';
while ($id > 0) {
$code = $chars[$id % 62] . $code;
$id = floor($id / 62);
}
return $code;
}
数据库存储映射关系
需要两张表:urls表存储原始URL,stats表用于统计访问数据。
CREATE TABLE urls (
id INT AUTO_INCREMENT PRIMARY KEY,
long_url TEXT NOT NULL,
short_code VARCHAR(10) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE stats (
id INT AUTO_INCREMENT PRIMARY KEY,
url_id INT,
visit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
referrer VARCHAR(255),
FOREIGN KEY (url_id) REFERENCES urls(id)
);
301重定向处理
当用户访问短链接时,通过PHP头部进行301永久重定向,有利于SEO。
$shortCode = $_GET['code'];
// 查询数据库获取对应长网址
header("HTTP/1.1 301 Moved Permanently");
header("Location: $longUrl");
exit;
防止重复和冲突
在生成短码后检查数据库是否已存在,若存在则重新生成或追加随机字符。可添加唯一索引确保数据完整性。
do {
$code = generateShortCode($url . mt_rand());
$exists = $db->query("SELECT COUNT(*) FROM urls WHERE short_code = '$code'")->fetchColumn();
} while ($exists > 0);
添加有效期控制
为短链接设置过期时间,自动清理过期记录。
ALTER TABLE urls ADD expires_at DATETIME DEFAULT NULL;
定期清理脚本:
$db->exec("DELETE FROM urls WHERE expires_at < NOW()");
统计功能实现
每次重定向时插入统计记录,后续可分析访问量、时间段分布等数据。
$db->prepare("INSERT INTO stats (url_id, referrer) VALUES (?, ?)")
->execute([$urlId, $_SERVER['HTTP_REFERER'] ?? '']);
安全性考虑
对输入URL进行验证过滤,防止XSS和SQL注入。使用预处理语句操作数据库。

$longUrl = filter_var($inputUrl, FILTER_VALIDATE_URL);
if (!$longUrl) {
throw new InvalidArgumentException('Invalid URL');
}






