必须启用cURL重定向跟随并用CURLINFO_EFFECTIVE_URL获取最终URL,优先信任Header中的charset,生产环境推荐cURL而非file_get_contents。

短链接还原时遇到 301/302 重定向无法捕获怎么办
PHP 本身不自动跟随重定向,file_get_contents() 或 curl_exec() 默认拿到的是跳转响应而非最终目标 URL。必须显式启用重定向跟随,否则会卡在中间跳转页(比如返回 Location: https://example.com/real 的 header)。
-
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true)是必需的,但仅此不够 - 若跳转链含跨域(如 t.co → twitter.com),还需加
curl_setopt($ch, CURLOPT_MAXREDIRS, 5)防止无限跳 - 某些短链服务(如 bit.ly)返回 302 +
Cache-Control: no-store,需确保curl_setopt($ch, CURLOPT_HEADER, false)关闭头输出干扰解析 - 用
curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)获取最终落地 URL,而不是解析Locationheader —— 后者在多级跳时不可靠
支持哪些编码格式的短链响应体
短链服务返回的响应体通常为空或极简 HTML,但少数(如微信内嵌短链、企业微信跳转页)可能返回 UTF-8、GBK 甚至带 BOM 的 UTF-8-BOM 页面。PHP 的 mb_detect_encoding() 在空响应或无 Content-Type 时极易误判。
- 优先信任 HTTP header 中的
Content-Type: text/html; charset=utf-8,用mb_convert_encoding($html, 'UTF-8', $detected)统一转码 - 若 header 缺失 charset,且响应体含
锛岄渶鐢ㄦ











