短链接跳转后页面显示乱码的常见原因是PHP重定向时未正确设置字符集响应头或数据库存储URL时未使用utf8mb4编码,导致中文等非ASCII字符被错误解码;需在header中显式声明charset=utf-8并对URL路径使用rawurlencode(),同时确保MySQL表、连接及字段均为utf8mb4。

短链接跳转后页面显示乱码的常见原因
PHP 服务端返回的短链接重定向(301 或 302)若目标 URL 含中文或特殊字符,但未正确声明响应头的字符集,浏览器会按默认编码(如 ISO-8859-1)解析,导致跳转后的页面 URL 栏或页面内容出现 %E4%BD%A0%E5%A5%BD 类似乱码或问号——这本质是 UTF-8 字节被错误解码的结果。
PHP header() 重定向前必须设置 Content-Type 和 charset
即使只是做跳转(不输出 HTML),也要显式声明响应头的字符集,否则 PHP 默认不发 charset,浏览器无法正确解码 Location 中的非 ASCII 字符。
- 错误写法:
header('Location: https://example.com/你好');(无 charset,浏览器可能误判) - 正确写法:
header('Content-Type: text/html; charset=utf-8');必须在header('Location: ...')前调用 - 更稳妥做法:对跳转 URL 中的路径部分做
rawurlencode(),再拼接完整 URL
header('Content-Type: text/html; charset=utf-8');
$target = 'https://example.com/' . rawurlencode('你好世界');
header('Location: ' . $target);
exit;
MySQL 存储短链接原始 URL 时的编码陷阱
如果短链接系统把原始长 URL 存进数据库,而字段用的是 latin1 或未指定 utf8mb4,那么含中文的 URL 插入时就被截断或转成 ?,后续读取还原时自然乱码。
- 检查表字符集:
SHOW CREATE TABLE short_urls;,确认 URL 字段为utf8mb4 - 连接层也需一致:PDO 初始化时加
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" - 避免用
mysql_real_escape_string()(已废弃),改用预处理 +utf8mb4连接
浏览器地址栏仍显示 %xx 编码?那是正常行为
现代浏览器(Chrome/Firefox/Safari)在地址栏中对非 ASCII 路径始终显示为百分号编码(如 %E4%BD%A0),但这不代表乱码——只要页面能正常渲染中文、接口返回正确 JSON、服务端日志里 $_SERVER['REQUEST_URI'] 可被 urldecode() 正确还原,就说明编码链路完整。
立即学习“PHP免费学习笔记(深入)”;
真正要验证的不是地址栏是否“好看”,而是:urldecode($_SERVER['REQUEST_URI']) 是否等于你存入数据库的原始 URL;以及 mb_detect_encoding() 检测结果是否为 UTF-8。











