短链接还原php用什么函数_详细讲解urldecode等函数用法【介绍】
发布时间 - 2026-01-03 00:00:00 点击率:次短链接还原必须通过HTTP请求跟踪重定向,不能仅用urldecode;应使用cURL设置CURLOPT_FOLLOWLOCATION和CURLOPT_NOBODY获取CURLINFO_EFFECTIVE_URL,或用file_get_contents配合stream_context(能力较弱)。
短链接还原不能只靠 urldecode,它只解码 URL 编码字符,不发起 HTTP 请求获取跳转目标。真正还原短链接,得用 PHP 发起请求跟踪重定向。
短链接还原的本质是跟踪 301/302 跳转
像 https://t.co/abc123 或 https://dwz.cn/xyz 这类短链,服务端实际返回的是 Location: https://real-url.com/... 响应头。PHP 必须发送 HEAD 或 GET 请求,并开启重定向跟随,才能拿到最终 URL。
-
urldecode()只处理类似%E4%BD%A0%E5%A5%BD这种编码,对短链本身无作用 - 短链地址本身通常已是合法 URL 字符(无 % 编码),
urldecode()调用后基本不变 - 必须用
curl或file_get_contents()配合流上下文选项来跟踪跳转
用 curl 获取真实 URL(推荐)
curl 支持细粒度控制重定向行为,是最可靠的方式。关键是设置 CURLOPT_FOLLOWLOCATION 和禁用 body 以提升速度。
function resolveShortUrl($shortUrl) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $shortUrl,
CURLOPT_NOBODY => true, // 只取 header,不下载 body
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true, // 自动跟随 Location
CURLOPT_MAXREDIRS => 5, // 防止环形跳转
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境建议保持 true 并配置 ca bundle
CURLOPT_HEADER => true, // 获取响应头,用于调试
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close($ch);
if ($httpCode >= 400 || !$finalUrl) {
return null;
}
return $finalUrl;
}
- 务必设
CURLOPT_NOBODY => true:多数短链服务只靠 header 返回跳转,省带宽又快 -
CURLINFO_EFFECTIVE_URL是最终到达的 URL,比手动解析Location头更稳妥(尤其多级跳转时) - 不要依赖
CURLOPT_HEADERFUNCTION自己解析Location,curl 内部重定向逻辑已处理 301/302/307/308 等全部情况
file_get_contents + stream_context 的替代方案
如果服务器禁用了 curl,可用 file_get_contents 配合自定义 context,但能力较弱,不支持自动多级跳转(PHP 7.4+ 才支持 max_redirects)。
$context = stream_context_create([
'http' => [
'method' => 'HEAD',
'max_redirects' => 5,
'timeout' => 10,
'ignore_errors' => true,
]
]);
$realUrl = file_get_contents($shortUrl, false, $context);
// 注意:file_get_contents 不直接暴露最终 URL,需读取 context 中的 'redirect' 信息
// 或改用 get_headers() + 手动循环,但易出错
-
get_headers($url, 1)可读取响应头,但需自己循环处理Location,遇到 307/308 或跨域跳转容易失败 - PHP 8.0+ 的
stream_context_set_params()仍无法在运行时动态获取最终 URL,不如 curl 直观 - 该方式在 open_basedir 或 allow_url_fopen = Off 时直接失效
urldecode、rawurldecode、htmlspecialchars_decode 的常见误用场景
这些函数和短链还原无关,但常被误认为“能解开短链”。它们只做字符串转义还原:
-
urldecode("hello%20world") → "hello world":还原 application/x-www-form-urlencoded 编码 -
rawurldecode("hello%20world") → "hello world":同上,但不把+当空格(更严格) -
htmlspecialchars_decode("zuojiankuohaophpcnscriptyoujiankuohaophpcn") → ":仅反转义 HTML 实体,和 URL 无关 - 若短链参数里带编码(如
https://t.co/abc?ref=%E4%BD%A0),才需对$_GET['ref']做urldecode()
别试图对整个短链 URL 调用 urldecode() —— 它大概率原样返回,还可能破坏合法的 % 字符(比如图片 URL 中的 %2F 被错误解成 /)。
# php
# html
# 编码
# app
# ssl
# curl
# stream
# 跨域
# lsp
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何在 React 中条件性地遍历数组并渲染元素
黑客如何利用漏洞与弱口令入侵网站服务器?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
微信公众帐号开发教程之图文消息全攻略
教你用AI将一段旋律扩展成一首完整的曲子
如何快速查询网址的建站时间与历史轨迹?
如何在建站主机中优化服务器配置?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
JavaScript如何实现继承_有哪些常用方法
利用vue写todolist单页应用
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
浅谈redis在项目中的应用
Python文件异常处理策略_健壮性说明【指导】
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何快速搭建自助建站会员专属系统?
Laravel如何使用Service Container和依赖注入?(代码示例)
php结合redis实现高并发下的抢购、秒杀功能的实例
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
如何在腾讯云服务器上快速搭建个人网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
JavaScript模板引擎Template.js使用详解
如何快速搭建高效香港服务器网站?
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
BootStrap整体框架之基础布局组件
如何在Windows服务器上快速搭建网站?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
JavaScript如何实现倒计时_时间函数如何精确控制
如何在服务器上配置二级域名建站?
如何基于云服务器快速搭建网站及云盘系统?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何实现模型的全局作用域?(Global Scope示例)
魔方云NAT建站如何实现端口转发?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
网站制作企业,网站的banner和导航栏是指什么?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
js实现获取鼠标当前的位置


链接还原必须通过HTTP请求跟踪重定向,不能仅用urldecode;应使用cURL设置CURLOPT_FOLLOWLOCATION和CURLOPT_NOBODY获取CURLINFO_EFFECTIVE_URL,或用file_get_contents配合stream_context(能力较弱)。