目录

http 路径伪静态请求参数“+”被转为空格的问题

问题描述

搜索功能做成伪静态把请求参数封装到path当中,经过encodeURIComponent 处理后,无论通过nginx还是apache对伪静态地址进行重定向到真是地址,path参数就会被解码处理+为空格。

例如:

伪静态地址:/search/keyword-Phone%20X%20Clay%20Mockups%20%5BPSD%2BSketch%5D

路由重写:RewriteRule ^search/keyword-(.+)/?$ search.php?q=$1 [L,QSA]

通过这种方式,q接收的参数如果遇到特殊字符+号,就会变成空格

错误解决方式:

1 在重定向规则后面加上B,例如:RewriteRule ^search/keyword-(.+)/?$ search.php?q=$1 [L,QSA,B]

2 多次url编码处理,比如两次encodeURIComponentencodeURIComponent(keyword))

前面两种方式试过了,都是错误的

问题解决

方式1:通过base64编码处理

这种方式虽然能解决问题,但是不太美观

方式2:后端直接手动解析url地址

function parseUrlPathQuery() {
    $fullUri = $_SERVER['REQUEST_URI'];
    $path = parse_url($fullUri, PHP_URL_PATH);
    // 取最后一段路径
    $lastPart = basename($path);
   // 拆分每个键值对
    $pairs = explode('-', $lastPart);


    $map = [];
    // 遍历,每两个元素一组作为 key => value
    for ($i = 0; $i < count($pairs); $i += 2) {
        if (isset($pairs[$i+1])) { // 确保有 value
            $map[$pairs[$i]] = urldecode($pairs[$i+1]);
        }
    }
    return $map;
}

这是php代码,其他语言思路一样,因为我的地址参数是按照 key1-value1-key2-value2 这种方式,所以解析代码就上面就可以了