在URL的末尾插入一个额外的参数

时间:2016-02-22 21:38:22

标签: php

我正在尝试在作为值传递的url的查询字符串的末尾注入一个额外的参数。 我试过了

<?PHP preg_replace('/(http:\/\/www.site.com)/i','$1',$_GET['url']."&EXTRA-PARAM");

但有时URL不包含任何查询字符串。我怎么能开始?而不是&amp;如果没有查询字符串presant

1 个答案:

答案 0 :(得分:0)

您的问题中的 preg_replace 无效:

 preg_replace('/(http:\/\/www.site.com)/i','$1',$_GET['url']."&EXTRA-PARAM");

无论最后一个参数是什么,它都会被 preg_replace 调用返回。要么你没有匹配,什么都没有被替换,或者你有匹配,但是你用你找到的东西替换你找到的东西。因此,在这两种情况下,您都会得到相同的结果。

$1是对http:\/\/www.site.com的反向引用,实际上引用的语句与此相当:

 preg_replace('/http:\/\/www.site.com/i','http:\/\/www.site.com',
              $_GET['url']."&EXTRA-PARAM");

您的最终价值始终是:

$_GET['url']."&EXTRA-PARAM"

所以,您可以使用它,并跳过 preg_replace

我在这里回答的是如何更好地编写该部分($_GET['url']."&EXTRA-PARAM"),即问题:&#34; 在URL的末尾插入额外的参数&#34 ;。

此连接可能导致缺少?。更糟糕的是,如果$_GET['url']有一个哈希值(#),它将不会导致功能参数。

以下是preg_replace_callback的解决方案。它考虑到给定的URL可能有也可能没有:

  • 哈希(#)组件;
  • 问号?
  • ?
  • 之后的一些查询
  • 一些&来分隔查询部分

该函数接受需要添加到提供的URL的查询部分的第二个参数,该URL可以是字符串(必须是URL编码的),或者是包含要添加到URL的项的关联数组。然后将该数组馈送到函数http_build_query

function addUrlQuery($url, $qry) {
    if (!is_string($qry)) $qry = http_build_query($qry);
    return preg_replace_callback("/^(.*?)(\?(.*?))?(#.*)?$/",
            function ($matches) use ($qry) {
                return $matches[1] . "?" . 
                    (empty($matches[3]) ? "" : $matches[3] . "&") . 
                    $qry . 
                    (empty($matches[4]) ? "" : $matches[4]);
            }, $url);
}

使用示例:

$url = addUrlQuery($_GET['url'], "EXTRA-PARAM");

echo addUrlQuery("http://myserver.com?x#title", ["EXTRA-PARAM" => 1]);

echo addUrlQuery("http://myserver.com/" . $relative_url, "EXTRA-PARAM");

您可以在eval.in上的多个测试用例中看到该函数运行。

$ _GET [&#39; url&#39;]

的问题

如果您将URL作为查询参数传递给当前URL,请执行以下操作:

http://myserver.com/index.php?url=http://test.com/index.php?a=1

然后你必须意识到这不是一个好的URL。某些角色需要转义。当然,&符号(&)需要被转义。如果你有这个:

http://myserver.com/index.php?url=http://test.com/index.php?a=1&b=2

问问自己:b是当前网址的查询参数,还是作为url参数传递的网址的查询参数?

答案:它是当前URL的查询参数。您可以使用$_GET['b']访问它。 $_GET['url']的价值现在只是:

http://test.com/index.php?a=1

所以......当你希望&成为b参数的查询参数而不是当前查询的查询参数时,你需要转义url

http://myserver.com/index.php?url=http://test.com/index.php?a=1%26b=2

请注意%26:它是&的代码。现在,如果你看$_GET['url'],你会得到:

http://test.com/index.php?a=1&b=2

如果没有正确编码提供URL会怎样?

在这种情况下,你必须做出假设。如果您确定url参数是 only 参数,您将获得当前网址,那么您可以得出结论,属于通过url参数传递的URL。

然后,您将获取$_GET以外的所有参数,url除外,并将它们(使用上述函数)添加到$_GET['url']的值。