短链接怎么用php递归还原_多层加密链接的处理法【详解】
技术百科
看不見的法師
发布时间:2026-01-01
浏览: 次 短链接还原本质是HTTP重定向链路追踪,需用get_headers()逐层解析Location头,校验URL、防环形跳转、设深度上限,并模拟真实UA/Referer。
短链接还原的本质是 HTTP 重定向链路追踪
PHP 本身不“还原”短链接,而是模拟浏览器行为,顺着 Location 响应头一层层跳转,直到拿到最终 URL。关键不是递归写法,而是正确处理重定向、避免死循环、识别中间跳转是否可信。
用 get_headers() + 手动跳转比 file_get_contents() 更可控
file_get_contents() 默认跟随重定向(max_redirects 有限制),但无法获取每跳的 URL 和状态码;而 get_headers() 能拿到原始响应头,适合逐层解析。注意:必须启用 user_agent,否则很多短链服务(如微博、微信)直接返回 403 或空白页。
- 设置
stream_context_create(),开启follow_location => false - 检查响应头中是否存在
Location:,且状态码为301、302、307、308 - 对
Location值做filter_var($url, FILTER_VALI校验,防止注入或相对路径拼错
DATE_URL) - 记录已访问 URL,避免环形跳转(比如 A → B → A)
递归函数要带深度限制和跳转计数器
真实场景中,短链可能嵌套 5–10 层(尤其营销裂变链),但超过 15 层基本可判定异常。不设上限容易栈溢出或卡死;不校验跳转来源可能落入恶意重定向陷阱。
function resolveShortUrl($url, $depth = 0, $maxDepth = 10, $visited = []) {
if ($depth > $maxDepth) return ['error' => 'max depth exceeded', 'url' => $url];
if (in_array($url, $visited)) return ['error' => 'redirect loop', 'url' => $url];
$context = stream_context_create([
'http' => [
'method' => 'HEAD',
'header' => "User-Agent: Mozilla/5.0 (X11; Linux x86_64)\r\n",
'ignore_errors' => true,
'max_redirects' => 0,
'timeout' => 5
]
]);
$headers = @get_headers($url, 1, $context);
if (!$headers || !is_array($headers)) {
return ['error' => 'failed to fetch headers', 'url' => $url];
}
$status = $headers[0] ?? '';
if (preg_match('/^HTTP\/\d\.\d\s+(30[1278])/', $status, $m)) {
$next = $headers['Location'] ?? null;
if (!$next) return ['error' => 'no Location header', 'url' => $url];
$next = filter_var($next, FILTER_VALIDATE_URL) ?: (parse_url($url, PHP_URL_SCHEME) ? rtrim($url, '/') . '/' . ltrim($next, '/') : null);
if (!$next) return ['error' => 'invalid redirect target', 'url' => $url];
return resolveShortUrl($next, $depth + 1, $maxDepth, array_merge($visited, [$url]));
}
return ['final_url' => $url, 'status' => $status, 'depth' => $depth];
}
微信、微博等平台短链需额外处理 Referer 和 UA
这类平台会校验 Referer 和 User-Agent,甚至检查请求是否来自微信内置浏览器(含 MicroMessenger 字符串)。纯命令行或 curl 默认 UA 会被拦截,返回 403 或跳转到下载页。
- UA 必须包含
MicroMessenger或模仿常见移动端 UA(如Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X)) - 部分接口要求
Referer为合法域名(如https://weibo.com/),否则拒绝响应 - 若目标 URL 是微信公众号文章,还可能触发
__biz+mid+idx参数混淆,此时需配合 JS 渲染或逆向分析(PHP 无法直接解密)
https 跳到 http 后被浏览器拦截)、中间页返回 200 却内嵌 JS 跳转(get_headers() 捕获不到),这种就得切到 headless 浏览器方案了。
# ai
# 微信
# 浏览器
# mac
# linux
# js
# curl
# stream
# 栈
# php
# 微信公众号
# filter_var
# iphone
# 微博
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php增删改查需要哪些扩展_开启mysqli或pd
- Windows10如何更改桌面背景_Win10个性
- Windows10系统怎么查看CPU温度_Win1
- Win11怎样安装剪映专业版_Win11安装剪映教
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Python高性能计算项目教程_NumPyCyth
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- Win10怎么查看内存时序参数_Win10CPU-
- Windows10怎么备份注册表_Windows1
- Windows10电脑怎么查看硬盘通电时间_Win
- Win11怎么关闭定位服务 Win11禁止应用获取
- Win11任务栏怎么固定应用 Win11将软件图标
- Python数据挖掘进阶教程_分类回归与聚类案例解
- 如何理解Go指针和内存分配关系_Go Pointe
- Windows服务无法启动错误1067是什么_进程
- Mac自带的词典App怎么用_Mac添加和使用多语
- LINUX如何删除用户和用户组_Linux use
- C++中的std::shared_from_thi
- php怎么下载安装后测试是否成功_简单脚本验证方法
- php本地部署后数据库连接报错_1045acces
- c++如何利用doxygen生成开发文档_c++
- Windows10怎么查看硬件信息_Windows
- 如何使用Golang实现函数指针_函数变量与回调示
- 如何在Golang中使用encoding/gob序
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Mac如何查看电池健康百分比_Mac系统信息电源检
- Windows10电脑怎么设置虚拟光驱_Win10
- 如何快速验证Golang安装是否成功_运行go v
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11关机界面怎么改_Win11自定义关机画面
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win10怎么卸载迅雷_Win10彻底卸载迅雷方法
- Win11怎么关闭OneDrive同步_Win11
- Python异步编程高级项目教程_asyncio协
- Drupal 中 HTML 链接被重复转义导致渲染
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何在Golang中验证模块完整性_Golangg
- Go 中实现 Python urllib.quot
- 如何高效删除 NumPy 二维数组中所有元素相同的
- Win11怎么关闭开机声音_Win11系统启动提示
- 如何使用Golang安装API文档生成工具_快速生
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- 如何在Golang中编写异步函数测试_Golang
- Win11怎么开启专注模式_Windows11时钟
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- c++怎么使用类型萃取type_traits_c+
- php8.4如何调用com组件_php8.4win
- Win11怎么设置默认图片查看器_Windows1

DATE_URL)
QQ客服