.htaccess 加号登录GET查询和比较URL

t9eec4r0  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(127)

我想检查页面的当前URL,如果在查询中包含+符号,如果没有+符号,我将重写URL并301重定向到一个新的URL。例如

www.sitename.com/search?q=123 456

这应当

www.sitename.com/search?q=123+456

首先我想用PHP做这个,首先,$_GET['q']和干净的字符串,用+替换空格,并与URL中当前的$_GET['q']进行比较,但问题是因为我不能在$_GET中获得+符号,简单的我不能检查URL是否包括+符号。
另一个选择是使用**.htaccess**

RewriteCond %{QUERY_STRING} ^q=(.*)$
RewriteRule ^search$ test.php?mode=search&q=%1 [L]

但我相信使用PHP可以更好地完成这一点,因为有更多的查询参数,而不仅仅是q
有些想法

$q1 = cleanq($_GET['q']) //This query include +,cleanq is function to clean string and replace space with +
    $q2 = $_GET['q'] //This is current one
    if(strcmp($q1, $q2) != 0){
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: www.sitename.com/search?q=".$q1);
        exit();
    }

看起来很简单,但无法获得登录查询进行比较,有什么想法如何使这一点?

7ajki6be

7ajki6be1#

由于URL规范的原因,URL中的字符+必须解释为空格,因为URL中不允许使用纯空格。
您不必担心将www.sitename.com/search?q=123 456重定向到www.sitename.com/search?q=123+456,它是同一个链接。
您可以在PHP文件中进行一个简单的测试:
test.php?search1=aaa bbb&search2=aaa+bbb

if ($_GET['search1'] == $_GET['search2']) {
    print 'Same string!';
}

您将得到Same string!
如果你想更新当前的URL,你可以用javascript来完成,用+替换编码的url空间%20

<script>
    const url = window.location.href.replace(/%20/, "+");
    window.history.replaceState(null, null, url)
</script>

使用$_SERVER['REQUEST_URI']进行PHP重定向

if (stripos($_SERVER['REQUEST_URI'], '%20') !== false) {
    $request_uri = str_replace('%20', '+', $_SERVER['REQUEST_URI']);
    $request_uri = preg_replace('/([+])\1+/', '$1', $request_uri);

    if ($request_uri != $_SERVER['REQUEST_URI']) {
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: " . $request_uri);
    }
}

相关问题