问题描述
搜索功能做成伪静态把请求参数封装到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 这种方式,所以解析代码就上面就可以了