PHP使用301 header跳转时特殊字符被自动编码如何解决
问题根因
你观察到的%E5%E4%F6异常编码并非UTF-8转码导致,恰恰是转码过程误用了Latin-1(ISO-8859-1)字符集才出现的错误结果:正确UTF-8编码下åäö的URL编码为%C3%A5%C3%A4%C3%B6,主流浏览器均能正常识别该编码,也可自动解码回原特殊字符显示。
解决方案
按优先级尝试以下操作即可修复:
- 统一全局字符集配置
确保PHP脚本本身编码为UTF-8、数据库读取跳转链接时的连接编码也配置为UTF-8,避免原始链接字符串本身就存在编码错误。以MySQL为例,可在执行查询前先设置连接编码:mysqli_set_charset($conn, 'utf8mb4'); - 手动规范URL编码格式
不要直接拼接包含特殊字符的完整链接,拆分链接的域名和路径部分后,对路径中的非ASCII字符单独做编码处理,保留/等路径分隔符不编码:// 从数据库读取的原始跳转链接 $redirect = "https://www.example.com/åäö"; // 拆分链接组件 $url_parts = parse_url($redirect); // 分段编码路径内容,保留分隔符 $encoded_path = implode('/', array_map('rawurlencode', explode('/', $url_parts['path']))); // 重构合规跳转链接 $final_redirect = $url_parts['scheme'] . '://' . $url_parts['host'] . $encoded_path; // 先声明输出编码,再发送301头部 header('Content-Type: text/html; charset=utf-8'); header("Location: " . $final_redirect, TRUE, 301); exit(); - 老旧服务兼容方案
如果目标上游服务器要求必须在头部输出未编码的特殊字符,可将UTF-8格式的原始链接强制转码为Latin-1后再输出:$redirect = "https://www.example.com/åäö"; $redirect = mb_convert_encoding($redirect, "ISO-8859-1", "UTF-8"); header("Location: ".$redirect, TRUE, 301); exit();
内容的提问来源于stack exchange,提问作者Algernop K.
相关产品推荐
相关产品推荐

