
本文详解 php 中使用 `urlencode()` 函数对字符串进行标准 url 编码的方法,解决 `+` 号被误解析为空格、特殊字符未转义导致重定向失败等问题,并提供安全重定向的完整实践示例。
在 PHP 中构建带参数的重定向 URL(如 header("Location: ..."))时,若原始数据包含空格、+、/、?、& 等特殊字符,直接拼接会导致 URL 语义错误。典型问题如:+ 在 URL 查询字符串中默认被解码为空格(因 application/x-www-form-urlencoded 规范将 + 视为空格),而非字面量加号;而 / 或 = 若未编码,可能被服务器误判为路径分隔符或参数分界符。
正确做法是:对每一个需作为查询参数值传递的变量,单独调用 urlencode() 进行编码。该函数严格遵循 RFC 3986,将非字母数字字符(除 -._~ 外)转换为 %XX 十六进制格式,且将空格编码为 %20(而非 +),从而彻底规避歧义。
以下是一个安全重定向的完整示例:
⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 不要对整个 URL 字符串调用 urlencode() —— 这会破坏协议头(如 http://)、域名和路径结构,导致请求失败;
- urlencode() 仅用于参数值,参数名(如 i0、ord)通常为固定 ASCII 字符,无需编码;
- 若需编码整个查询字符串(如动态构造键值对),可使用 http_build_query(),它内部自动调用 urlencode() 并处理数组:
$params = ['i0' => $eqn . '/aa', 'ord' => $ord]; $query = http_build_query($params); // 自动编码所有值 $target_url = "http://example.com/?{$query}"; - 务必在 header() 前检查输出缓冲或避免任何 echo/空白符,否则触发 headers already sent 错误;
- 对用户输入(如 $_GET)始终做编码,既是 URL 安全要求,也是防御潜在注入风险的基础措施。
总结:urlencode() 是 PHP 中 URL 参数编码的黄金标准函数。坚持“值编码、键不编、URL 不全编”三原则,即可确保 + 正确变为 %2B、空格变为 %20、斜杠变为 %2F,让重定向 URL 在任意服务端都能被准确解析与还原。











