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

PHP - urlencoded() ampersand in url perceived as actual ampersand

有一个虚拟示例 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
这很好,但是如果我们访问 link,脚本将 return:

Array

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

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

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

会不会是这个原因? - 确认的。这是问题所在。请参阅下面我的回答。

你可以关注 this.if 你的数组就是这样

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

你可以像这样构建 url

echo http_build_query($data)

它会给出这样的输出

p=one&q=two

您需要使用 % 来转义符号来发送您的 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>");
?>

我发现了问题。问题是 PHP 权力的布局。
URL 重写有问题:

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

新的工作版本:

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

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