短链接怎么用php递归还原_多层加密链接的处理法【详解】

发布时间 - 2026-01-01 00:00:00    点击率:
短链接还原本质是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:,且状态码为 301302307308
  • Location 值做 filter_var($url, FILTER_VALIDATE_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

这类平台会校验 RefererUser-Agent,甚至检查请求是否来自微信内置浏览器(含 MicroMessenger 字符串)。纯命令行或 curl 默认 UA 会被拦截,返回 403 或跳转到下载页。

立即学习“PHP免费学习笔记(深入)”;

  • 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 浏览器方案了。


# php  # linux  # js  # 微信公众号  # 微信  # 浏览器  # iphone  # 微博  # mac  # curl  #   # ai  # stream  # filter_var 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel distinct去重查询_Laravel Eloquent去重方法  深入理解Android中的xmlns:tools属性  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何快速搭建高效WAP手机网站吸引移动用户?  Python制作简易注册登录系统  如何有效防御Web建站篡改攻击?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel storage目录权限问题_Laravel文件写入权限设置  ,在苏州找工作,上哪个网站比较好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  简单实现jsp分页  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  潮流网站制作头像软件下载,适合母子的网名有哪些?  zabbix利用python脚本发送报警邮件的方法  利用 Google AI 进行 YouTube 视频 SEO 描述优化  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Android 常见的图片加载框架详细介绍  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  制作企业网站建设方案,怎样建设一个公司网站?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  智能起名网站制作软件有哪些,制作logo的软件?  PythonWeb开发入门教程_Flask快速构建Web应用  jQuery 常见小例汇总  javascript基本数据类型及类型检测常用方法小结  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  javascript中闭包概念与用法深入理解  Laravel如何创建自定义Artisan命令?(代码示例)  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】