淘宝短链接通常以.tb.cn等域名形式出现,用户点击后浏览器会连续发生多次302重定向,最终到达真实的商品详情页。在PHP中如果我们想还原这条链路并找回原链接,就不能让请求自动跟随跳转,而是要手动分析每一次响应头里的Location值。

为什么需要手动分析302跳转
使用默认配置时,curl会把所有302、301跳转一次性走完,只返回最后一个页面的内容。这样虽然能拿到最终页,但丢失了中间过程,也无法确认跳转是否合规。通过关闭自动跳转,我们可以把每一跳的URL都记录下来,形成完整的跳转汇总表。
PHP实现短链接还原的核心代码
下面这段代码演示了如何发送HTTP请求并禁止自动跳转,从响应头中提取Location实现逐层追踪。
<?php
// 初始化curl,禁止自动跟随跳转
function get_location($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 关键:不自动跳转
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$resp = curl_exec($ch);
curl_close($ch);
// 从响应头中匹配Location
if (preg_match('/Location:s*(.+)r/i', $resp, $m)) {
return trim($m[1]);
}
return null;
}
// 分析淘宝短链接跳转链
$start = 'https://tb.cn/xxxxxx';
$chain = array();
$current = $start;
$seen = array();
while ($current && !isset($seen[$current])) {
$seen[$current] = true;
$chain[] = $current;
$next = get_location($current);
if ($next && strpos($next, 'http') !== 0) {
// 处理相对路径
$next = dirname($current) . '/' . ltrim($next, '/');
}
$current = $next;
}
echo "跳转记录:n";
print_r($chain);
?>
跳转记录汇总与说明
运行上述脚本后,$chain数组里就保存了从短链接到原链接的全部路径。常见淘宝短链会先跳到跳板域名,再跳到商品页。你可以把这些记录写入数据库或日志,方便后续比对。
| 层数 | URL类型 | 说明 |
|---|---|---|
| 1 | tb.cn短链 | 用户拿到的原始短网址 |
| 2 | 跳转中间域 | 淘宝内部统计或风控域 |
| 3 | 商品原链接 | detail.taobao.com真实页 |
注意事项
- 部分短链带签名参数,缺失会跳转到首页,需保留完整QueryString。
- 遇到循环跳转时,代码中的$seen判断能避免死循环。
- 如果响应是HTTPS且证书异常,可临时加CURLOPT_SSL_VERIFYPEER为false便于调试。
总结
用PHP还原淘宝短链接的本质就是关闭curl的自动跳转,依靠响应头中的Location字段一层层往下查。把每次的URL存起来,就能完整分析302跳转记录并找回原链接。这个方法同样适用于其他带有中间跳转的短网址场景。