短链接还原是开发中常见的功能需求,通过php实现短链接到原链接的映射后,有时会遇到还原得到的原链接无法访问的情况,这时候需要判断原链接是否已经过期。短链接的本质是将长链接映射为短字符串存储在数据库或缓存中,还原时通过短码查询对应的原链接即可。

php实现短链接还原的基础逻辑
短链接还原的核心是从存储映射关系的地方获取短码对应的原链接,常见存储方式包括MySQL数据库、Redis缓存等。以下是基于MySQL数据库实现短链接还原的php示例代码:
<?php
// 数据库连接配置
$host = '127.0.0.1';
$user = 'root';
$pass = '123456';
$dbname = 'short_link_db';
// 连接数据库
$conn = new mysqli($host, $user, $pass, $dbname);
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
// 获取短码,假设短链接格式为 http://domain.com/s/abc123,短码为abc123
$shortCode = isset($_GET['code']) ? trim($_GET['code']) : '';
if (empty($shortCode)) {
die("短码不能为空");
}
// 查询对应的原链接
$sql = "SELECT original_url FROM short_link WHERE short_code = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $shortCode);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$originalUrl = $row['original_url'];
echo "还原得到的原链接: " . $originalUrl;
} else {
echo "未找到对应的原链接,短码无效";
}
$stmt->close();
$conn->close();
?>
确认原链接是否过期的方法
还原得到原链接后,需要通过校验判断原链接是否已经过期,常见的校验方式有以下几种。
1. 发送HTTP请求判断响应状态码
通过php发送HTTP请求到原链接,根据返回的响应状态码判断链接是否有效。2xx状态码表示链接正常,404表示资源不存在,403表示无权限访问,500及以上表示服务器错误,这些都可能意味着原链接已经过期或无法访问。
以下是使用curl扩展发送请求检测链接状态的示例代码:
<?php
function checkUrlStatus($url) {
$ch = curl_init();
// 设置curl选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true); // 获取响应头
curl_setopt($ch, CURLOPT_NOBODY, true); // 不获取响应体,减少请求开销
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置超时时间10秒
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向
curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取HTTP状态码
$error = curl_error($ch);
curl_close($ch);
if (!empty($error)) {
return "请求失败: " . $error;
}
return $httpCode;
}
// 测试原链接状态
$testUrl = "https://ipipp.com/test/page";
$status = checkUrlStatus($testUrl);
echo "原链接的HTTP状态码: " . $status;
if ($status == 200) {
echo ",原链接正常可访问";
} elseif ($status == 404) {
echo ",原链接资源不存在,已过期";
} else {
echo ",原链接访问异常,可能已过期";
}
?>
2. 检查链接对应的业务过期标识
如果原链接是业务系统内部的链接,通常会在数据库或缓存中存储链接的过期时间,这时候可以直接查询对应的过期标识判断链接是否过期,不需要发送HTTP请求。
假设原链接关联的业务表中有expire_time字段存储过期时间,校验示例如下:
<?php
// 假设已经获取到原链接对应的业务ID,这里简化为直接查询
$businessId = 123;
$conn = new mysqli('127.0.0.1', 'root', '123456', 'business_db');
$sql = "SELECT expire_time FROM business_link WHERE id = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $businessId);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
$expireTime = strtotime($row['expire_time']);
$currentTime = time();
if ($expireTime < $currentTime) {
echo "原链接已过期,过期时间: " . date("Y-m-d H:i:s", $expireTime);
} else {
echo "原链接未过期,过期时间: " . date("Y-m-d H:i:s", $expireTime);
}
} else {
echo "未找到对应的业务链接信息";
}
$stmt->close();
$conn->close();
?>
3. 检测链接对应的资源是否存在
如果原链接指向的是服务器上的静态资源,比如文件、图片等,可以直接检查服务器上对应的资源文件是否存在,判断链接是否过期。
<?php
// 假设原链接是服务器上的文件链接,格式为 http://domain.com/uploads/file/123.pdf
$originalUrl = "http://127.0.0.1/uploads/file/123.pdf";
// 解析URL获取文件路径,这里假设域名对应服务器根目录为 /var/www/html
$urlPath = parse_url($originalUrl, PHP_URL_PATH);
$filePath = "/var/www/html" . $urlPath;
if (file_exists($filePath)) {
echo "原链接对应的文件存在,未过期";
} else {
echo "原链接对应的文件不存在,已过期";
}
?>
常见问题与解决思路
- 短链接还原后得到的原链接本身正确,但访问时提示404:这种情况大概率是原链接对应的资源已经被删除,属于原链接过期的情况,可通过上述HTTP请求检测或资源存在性检测确认。
- 短链接还原逻辑正确,但查询不到原链接:说明短码本身无效,可能是短链接生成后未正确存储,或者短码被篡改,不属于原链接过期的问题。
- 原链接返回301/302重定向后无法访问:需要跟随重定向获取最终的响应状态码,再判断最终链接是否有效,上述curl示例已经开启了跟随重定向的配置。
总结
短链接还原后链接失效时,首先确认还原逻辑是否正确获取到原链接,再通过发送HTTP请求判断响应状态码、检查业务过期标识、检测资源存在性等方法来确认原链接是否已经过期。不同的场景可以选择不同的检测方式,业务内部链接优先使用业务标识校验,外部链接优先使用HTTP状态码检测,这样能更高效地定位问题。