【问题标题】:PHP $_GET var with urlencode and "&" bugPHP $_GET var 带有 urlencode 和 "&" 错误
【发布时间】:2011-07-08 15:01:13
【问题描述】:

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

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

我使用 url-rewriting 并且我的 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 传递。显然,它们并没有什么特别之处,例如,“Décarie Square”就犯了这个错误。其他带有空格和“é”的字符串工作正常。

【问题讨论】:

  • 看看这个页面 URL:标题说“PHP $_GET var with urlencode and “&” bug” .. 但是你看到 URL 中的那些特殊字符了吗?你也应该这样做。这样做是有原因的……这是最好的方法。

标签: php .htaccess url url-rewriting urlencode


【解决方案1】:

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

试试

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

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

哦,那里应该还有htmlentities()

【讨论】:

  • 我使用了你的例子并对我的字符串进行了两次编码,但我没有放任何 htmlenitites() 并且它工作正常。谢谢。
  • 什么样的框架可以处理URL路由?我从来没有听说过除了 apache url-rewritng
  • @Marm 几乎任何现代框架都可以做到这一点:Yii、Symfony、Zend 等。甚至 WordPress 也有自己的路由实现(只需 1 或 2 条基本规则即可将这些“好”的 URL 重定向到index.php
【解决方案2】:

Apache 会自动翻译(解码)路径。您必须使用不同的编码甚至双重编码。 Base 64 可以工作。

【讨论】:

    【解决方案3】:

    您的 $str 未使用 key=val 对设置

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

    【讨论】:

    • 我不能,我正在使用 url 重写,因为我不想要这个。我正在尝试建立一个“美丽”的链接。而不是domain.com/index.php?var1=string&var2=number,我想要domain.com/string/number
    • 在我的例子中,substring1 和 substring2 是同一个字符串的一部分,中间有“&”,它们不是 2 个变量。第二个 var 是一个数字(在本例中为 1)
    • 有趣的做事方式。试试这个:urlencode(htmlentities($str))
    【解决方案4】:

    两种选择:

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

    至于禁止的错误你是使用http auth basic还是digest?

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

    【讨论】:

    • 我没有对查询进行编码,我只对字符串进行了编码。为什么我也要对查询进行编码?
    • @marm 你说得对,我误解了你应该使用的问题htmlentities
    猜你喜欢
    • 2012-04-14
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多