PHP $_GET var with urlencode and "&" bug


PHP $_GET var with urlencode and "&" bug

在我的代码中,我创建了一个这样的链接:

$link = 'http://www.mydomain.com/'.urlencode($str).'/1';

我使用url重写,在我的htaccess文件中的规则是这样的:

rewriteRule ^(.+)/(.*)$ index.php?var1=$1&var2=$2 [NC,L]

这段代码对几乎所有字符串都工作得很好。但有时,要编码的字符串包含"&"。urlencode函数对它进行了正确的编码,但是当我在php中读取$_GET数组时,它看起来像这样(带有$str = 'substring1&substring2'):

'var1' => 'substring1' (without "&")
'substring2' => '' (without "&")
'var2' => 1

我真的需要"&"在我的var.有没有一种方法来编码字符,使其工作?

也,我真的不知道为什么,但有时我得到一个禁止的http错误与一些字符串传递为var1。显然,它们没有什么特别之处,例如,"dacarie Square"犯了这个错误。其他带有空格和" "的字符串工作正常

Apache的mod_rewrite在进行正则表达式匹配时自动解码urlencoded字符串。但它只会这样做一次,所以如果你对字符串进行两次urlencode,你就应该这样做。这将重新转义所有的' %'字符。

$link = 'http://www.mydomain.com/'.urlencode(urlencode($str)).'/1';

或者停止依赖重写规则,使用一个能够正确处理URL路由的框架。

哦,这里应该还有htmlentities()

Apache将自动翻译(解码)路径。您必须使用不同的编码,甚至是双重编码。

您的$str没有设置key=val对

尝试$str = 'var1=substr1&var2=substr2';

两个选项:

  • 在urlencoding查询之前Urlencode字符串
  • 用破折号或下划线替换所有非字母数字字符

对于被禁止的错误,您使用的是http认证基本还是摘要?

更新可能会错误地尝试使用htmlentitieshtmlspecialchars而不是urlencode