在查询字符串中有一个外部页面,它使用param值传递URL。到我的页面。
例如:page.php?URL = http://www.domain2.com?foo=bar
我尝试使用
保存参数 $url = $_GET['url']
问题是reffering页面没有发送它编码。因此它识别出任何落后于"&"作为一个新的参数的开始。 我需要一种方法来解析网址,使任何事情落后于第二个"?"是部分或传递的url而不是acctual查询字符串。
答案 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上看到它正在运行。