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

如何用PHP检测GET查询中的+号并实现URL 301重定向?

解决方案:用原始查询字符串实现检测与重定向

问题的核心是$_GET会自动解码URL编码字符(把+和%20都转成空格),所以无法直接通过它判断原始参数中是否存在+。你需要直接读取未经解码的原始查询字符串来完成检测。

实现步骤

  1. 获取当前请求的路径和原始查询字符串
  2. 检查查询字符串中是否包含+
  3. 如果不包含,将查询字符串中的%20(空格的URL编码)替换为+
  4. 构建新URL并发送301重定向

完整代码示例

// 获取当前请求的路径部分(不含查询参数)
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// 获取原始查询字符串(?后面的部分,未经解码)
$queryString = $_SERVER['QUERY_STRING'];

// 检查查询字符串是否存在,且不包含+号
if (!empty($queryString) && strpos($queryString, '+') === false) {
    // 将%20替换为+
    $newQueryString = str_replace('%20', '+', $queryString);
    // 构建新URL
    $newUrl = $path . '?' . $newQueryString;

    // 发送301永久重定向
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $newUrl);
    exit; // 终止后续代码执行,避免输出内容
}

关键说明

  • $_SERVER['QUERY_STRING']:直接获取URL中?之后的原始内容,不会自动解码,能保留+或%20的原始状态,这是实现检测的核心。
  • 避免无限重定向:只有当查询字符串中确实没有+时才执行替换,替换后的URL包含+,不会再次触发重定向。
  • 处理多查询参数:该方案支持多个查询参数的场景,比如?q=123 456&category=test会被重定向为?q=123+456&category=test,完全适配你的需求。

补充:关于.htaccess的替代方案

如果后续想尝试用.htaccess实现,也可以通过RewriteCond匹配查询字符串中的%20,再用RewriteRule替换,示例如下(同样支持多参数):

RewriteEngine On
# 匹配查询字符串中包含%20的请求
RewriteCond %{QUERY_STRING} ^(.*)%20(.*)$
# 将%20替换为+,并执行301重定向
RewriteRule ^(.*)$ /$1?%1+%2 [L,R=301]

不过这个规则会循环替换所有%20,直到查询字符串中没有%20为止,同样能达到效果。

内容的提问来源于stack exchange,提问作者fadoh35877

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:35:24