Php zf2重定向,查询字符串包含+;而不是20%

Php zf2重定向,查询字符串包含+;而不是20%,php,redirect,zend-framework,zend-framework2,Php,Redirect,Zend Framework,Zend Framework2,在ZF2中,我知道我可以创建一个301重定向,并附加一个查询字符串,如下所示: $options = [ 'query' => [ 'string' => 'hello world', ] ]; return $this->redirect() ->toRoute('myRoute', [], $options) ->setStatusCode(301); 但是,这会重定向到附加

在ZF2中,我知道我可以创建一个301重定向,并附加一个查询字符串,如下所示:

$options = [ 
    'query' => [
        'string' => 'hello world', 
    ]
];

return $this->redirect()
            ->toRoute('myRoute', [], $options)
            ->setStatusCode(301);

但是,这会重定向到附加了
hello%20world
的URL。在ZF2中,是否有一种方法可以将此重定向写入附加了
hello+world
的内容?

您的url被正确地
url\u encode
d。它被“转换”为URL的有效字符

在接收端,您的
“hello%20world”
将作为
“hello world”
自动接收


没有什么需要修复的,代码正在按预期工作。

由于ZF2不提供本机函数,无法使用
urlencode
而不是
rawurlencode
使用查询字符串重定向,因此我们编写了一个自定义方法来重定向。不太漂亮,但现在解决了我们的问题:

private function redirectToPageFive($query)
{   
    $location = ($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://')
              . $_SERVER['HTTP_HOST']
              . '/search?query='
              . urlencode($query)
              . '&page=5';

    header("Location: $location", true, 301);
    exit;
}

+0实际上,字符串不是
urlencode
d。它是
rawurlencode
d,结果是
%20
,而不是首选的
+
。我们需要一个唯一的URL为每个搜索查询。因此,我们需要重定向到
hello+world
,而不是
hello%20world
。现有的代码可能会按照最初的预期执行,但我们需要选择
urlencode
,而不是
rawurlencode