PHP - 在url中的urlencoded()&符号被视为实际的&符号

时间:2015-06-10 14:03:17

标签: php parameter-passing urlencode ternary-operator

有一个虚拟示例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>

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

3 个答案:

答案 0 :(得分:1)

您需要使用%发送您的网址以逃避&符号。 试试这个'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>");
?>

答案 1 :(得分:0)

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

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

你可以像这样建立网址

echo http_build_query($data)

它将提供这样的输出

p=one&q=two

答案 2 :(得分:0)

我发现了问题。问题在于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

相关问题