You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:45:03