解析非编码的url

时间:2016-02-18 22:28:47

标签: php redirect

在查询字符串中有一个外部页面,它使用param值传递URL。到我的页面。

  

例如:page.php?URL = http://www.domain2.com?foo=bar

我尝试使用

保存参数
 $url = $_GET['url']

问题是reffering页面没有发送它编码。因此它识别出任何落后于"&"作为一个新的参数的开始。 我需要一种方法来解析网址,使任何事情落后于第二个"?"是部分或传递的url而不是acctual查询字符串。

4 个答案:

答案 0 :(得分:0)

获取完整的查询字符串,然后取出'网址='部分内容

$name = http_build_query($_GET);
$name = substr($name, strlen('URL='));

答案 1 :(得分:0)

安东尼奥的回答可能是最好的。一种不那么优雅的方式也可以起作用:

$url = $_GET['url'];
$keys = array_keys($_GET);

$i=1;
foreach($_GET as $value) {
    $url .= '&'.$keys[$i].'='.$value;
    $i++;
}

echo $url;

答案 2 :(得分:0)

这样的事情可能有所帮助:

// The full request
$request_full = $_SERVER["REQUEST_URI"];
// Position of the first "?" inside $request_full
$pos_question_mark = strpos($request_full, '?');
// Position of the query itself
$pos_query = $pos_question_mark + 1;
// Extract the malformed query from $request_full
$request_query = substr($request_full, $pos_query);
// Look for patterns that might corrupt the query
if (preg_match('/([^=]+[=])([^\&]+)([\&]+.+)?/', $request_query, $matches)) {
  // If a match is found...
  if (isset($_GET[$matches[1]])) {
    // ... get rid of the original match...
    unset($_GET[$matches[1]]);
    // ... and replace it with a URL encoded version.
    $_GET[$matches[1]] = urlencode($matches[2]);
  }
}

答案 3 :(得分:0)

正如您在问题中暗示的那样,您获得的URL的编码并不是您想要的:&将标记当前URL的新参数,而不是{{1}中的参数参数。如果网址编码正确,则url将被转义为&

但是,好的,鉴于你确定%26之后的所有内容都没有被转义并且应该是该参数值的一部分,你可以这样做:

url=

因此,例如,当前的URL是:

$url = preg_replace("/^.*?([?&]url=(.*?))?$/i", "$2", $_SERVER["REQUEST_URI"]);

然后返回的值为:

http://www.myhost.com/page.php?a=1&URL=http://www.domain2.com?foo=bar&test=12

eval.in上看到它正在运行。