【问题标题】:PHP - urlencoded() ampersand in url perceived as actual ampersandPHP - url中的urlencoded()&符号被视为实际&符号
【发布时间】:2015-06-10 14:03:17
【问题描述】:

有一个虚拟的 PHP 应用程序示例,它显示了导致我出现问题的原因。

<?PHP
echo ((isset($_GET['P'])) ? print_r($_GET) : "<a href='http://example.com/a.php?P=" . urlencode('One & Two') . "'>One & Two</a>");

?>


如果我们访问没有P参数的页面,页面会输出:
http://example.com/One+%26+Two
这很好,但是如果我们访问链接,脚本会返回:

Array

    (
        [P] => One
        [Two] => 
    )

这显然是错误的。
在实际应用中,在 url 中提交了大约 30 个字符长的字母数字字符串,其中包含特殊字母(瑞典语)。
编辑:在我的真实应用程序中,我使用 URL 重写:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^(.*)$ ../example.php?s=$1 [L,QSA]
</IfModule>

这可能是原因吗? - 确认的。这就是问题所在。请参阅下面的答案。

【问题讨论】:

    标签: php parameter-passing urlencode ternary-operator


    【解决方案1】:

    您需要使用 % 发送您的 URL 以转义 & 符号。 试试这样'One %26 Two'

    <?PHP
    echo ((isset($_GET['P'])) ? print_r($_GET) : "<a href='http://example.com/a.php?P=One %26 Two'>One & Two</a>");
    ?>
    

    【讨论】:

    • 所以我应该转义将被 urlencode 转义的 & 符号?你甚至读过完整的问题吗?无论如何,谢谢。
    • 您也从未说过您正在使用重写。如果您使用 % 对其进行转义,则不需要使用 urlencode
    • 这是一个巨大的项目,并且url rewrite是两个月前项目开始时添加的,所以我完全忘记了。在实际应用中,URL 中要编码的内容比示例中的要多得多,因此手动编码不是一种选择。
    • 您只给出了 this 的问题示例。您从未说过您有很多 url,或者这是整个应用程序中的问题。我们不是读心术的人。 :)
    • 但我确实做到了,一开始我说那是虚拟示例应用程序,而在接近尾声的某个地方我说:“在实际应用程序中......”
    【解决方案2】:

    你可以关注这个。如果你的数组是这样的

    $data = array('p'=>'one',
              'q'=>'two');
    

    你可以像这样构建网址

    echo http_build_query($data)
    

    它会给出这样的输出

    p=one&q=two
    

    【讨论】:

    • 感谢您的回复,但您的回答究竟如何解决了我的问题?
    • 首先使用键和值创建一个数组。然后使用 http_build_query() 将该数组创建为 url。
    • 然后呢?您刚刚告诉我构建 url 查询的方法,这是我已经知道的,但为了简单起见并没有在示例中使用。问题不在于 url 编码,而在于它看到 URL 编码字符串的 PHP-s 方式。
    【解决方案3】:

    我发现了问题。问题在于 PHP 的能力。
    这是 URL 重写的问题:

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule ^(.*)$ ../example.php?s=$1 [L,QSA]
    </IfModule>
    

    新的工作版本:

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule ^(.*)$ ../example.php?s=$1 [B,L,QSA]
    </IfModule>
    

    参考:data being stripped off after ampersand in URL even when using urlencode

    【讨论】:

    • B 标志正确地转义了 URL,因此 & 变成了 %26,这就是我所说的手动操作。但是,您的重写规则不是您原始问题的一部分。所以是的,我确实读过它。
    • 但是手动操作并不是真正应用中的解决方案,要编码的东西要多得多。
    • 我明白,如果给定的重写规则最初可能会给出正确的答案。祝你的应用好运。
    猜你喜欢
    • 2015-02-07
    • 2016-06-02
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多