在我的代码中,我创建了一个这样的链接:
$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认证基本还是摘要?
更新可能会错误地尝试使用htmlentities
或htmlspecialchars
而不是urlencode