短链接本质是通过服务端跳转将短地址映射到原始长地址,还原短链接就是获取这个跳转后的真实长地址,php可以通过获取请求头中的跳转信息来实现这个功能。

短链接跳转的核心原理
短链接服务的工作流程通常是:用户访问短链接地址,短链接服务端接收到请求后,根据短链接的唯一标识查询对应的原始长链接,然后通过HTTP状态码301或302返回跳转指令,在响应头的Location字段中携带原始长链接,浏览器接收到响应后会自动跳转到真实地址。
所以还原短链接的核心就是获取跳转响应头中的Location字段内容,php中可以通过发送HTTP请求并捕获响应头的方式实现这个需求。
php还原短链接的实现方法
方法一:使用curl扩展实现
curl是php中常用的网络请求扩展,支持获取请求的响应头信息,我们可以通过设置curl不自动跳转,只获取响应头中的Location字段来还原短链接。
具体实现步骤如下:
- 初始化curl会话
- 设置请求的目标短链接地址
- 设置curl不自动跟随跳转
- 设置获取响应头信息
- 执行请求并获取响应头
- 从响应头中解析出
Location字段内容
下面是完整的代码示例:
<?php
/**
* 使用curl还原短链接
* @param string $shortUrl 待还原的短链接
* @return string|false 还原后的长链接,失败返回false
*/
function restoreShortUrlByCurl($shortUrl) {
// 初始化curl
$ch = curl_init();
// 设置请求的短链接地址
curl_setopt($ch, CURLOPT_URL, $shortUrl);
// 设置不自动跟随跳转,只获取原始响应
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
// 设置获取响应头信息
curl_setopt($ch, CURLOPT_HEADER, true);
// 设置不输出响应体内容
curl_setopt($ch, CURLOPT_NOBODY, true);
// 设置请求超时时间为10秒
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
// 设置返回响应内容为字符串
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$response = curl_exec($ch);
// 获取请求错误信息
$error = curl_error($ch);
// 关闭curl会话
curl_close($ch);
// 如果请求失败,返回false
if ($error) {
return false;
}
// 解析响应头中的Location字段
if (preg_match('/Location:s*(.*?)s/i', $response, $match)) {
return trim($match[1]);
}
return false;
}
// 测试示例,替换为实际的短链接地址
$shortUrl = "http://ipipp.com/abc123";
$longUrl = restoreShortUrlByCurl($shortUrl);
if ($longUrl) {
echo "还原后的长链接为:" . $longUrl;
} else {
echo "短链接还原失败";
}
?>
方法二:使用file_get_contents配合流上下文实现
如果服务器没有开启curl扩展,也可以使用file_get_contents函数配合流上下文来获取响应头信息,同样可以实现短链接还原。
需要注意的是,这种方法需要服务器开启allow_url_fopen配置,否则无法请求外部地址。
具体代码示例如下:
<?php
/**
* 使用file_get_contents还原短链接
* @param string $shortUrl 待还原的短链接
* @return string|false 还原后的长链接,失败返回false
*/
function restoreShortUrlByFileGet($shortUrl) {
// 设置流上下文参数,不跟随跳转,获取响应头
$opts = array(
'http' => array(
'method' => 'GET',
'follow_location' => 0,
'timeout' => 10
)
);
$context = stream_context_create($opts);
// 发送请求获取响应头
$response = @file_get_contents($shortUrl, false, $context);
// 如果请求失败,返回false
if (!$response) {
return false;
}
// 从响应头中解析Location字段
foreach ($http_response_header as $header) {
if (stripos($header, 'Location:') === 0) {
return trim(substr($header, 9));
}
}
return false;
}
// 测试示例
$shortUrl = "http://ipipp.com/def456";
$longUrl = restoreShortUrlByFileGet($shortUrl);
if ($longUrl) {
echo "还原后的长链接为:" . $longUrl;
} else {
echo "短链接还原失败";
}
?>
常见问题及解决方法
问题1:还原后返回false
出现这种情况可能有三个原因:一是短链接本身不存在或者已经失效,二是请求超时,三是短链接使用的是301永久跳转且之前已经被浏览器缓存过,此时可以尝试更换短链接测试,或者检查服务器的网络连通性。
问题2:获取到的Location字段是相对路径
部分短链接服务返回的Location字段是相对路径,不是完整的URL,此时需要将短链接的域名和相对路径拼接成完整地址,拼接示例如下:
<?php $shortUrl = "http://ipipp.com/abc"; $location = "/path/page.html"; // 获取到的相对路径 // 解析短链接的域名部分 $parseUrl = parse_url($shortUrl); // 拼接完整URL $fullUrl = $parseUrl['scheme'] . "://" . $parseUrl['host'] . $location; echo $fullUrl; // 输出 http://ipipp.com/path/page.html ?>
问题3:短链接有多重跳转
如果短链接经过多次跳转,上述方法只能获取到第一次跳转的地址,需要循环请求直到没有Location字段为止,示例代码如下:
<?php
function restoreMultiJumpShortUrl($shortUrl) {
$currentUrl = $shortUrl;
$maxJump = 5; // 最多跟随5次跳转,避免无限循环
$jumpCount = 0;
while ($jumpCount < $maxJump) {
$nextUrl = restoreShortUrlByCurl($currentUrl);
if (!$nextUrl) {
break;
}
$currentUrl = $nextUrl;
$jumpCount++;
}
return $currentUrl;
}
?>
注意事项
在使用php还原短链接时,需要注意遵守短链接服务的使用规则,不要频繁请求避免被封禁IP。另外,部分短链接可能携带身份验证信息,还原后的链接不要随意公开,避免造成信息泄露。
短链接还原phpURL解码redirect_url修改时间:2026-06-26 20:09:46