есть внешняя страница, которая передает URL-адрес, используя значение параметра, в строке запроса. на мою страницу.
например: page.php? URL = http://www.domain2.com?foo=bar
- перенаправить пользователя после нажатия ссылки на процесс sql?
- Как перенаправить URL программно в WordPress?
- Как сгенерировать URL-адреса перенаправления, похожие на stackoverflow с использованием .htaccess и php?
- CakePHP - Маршрутизация с использованием префикса 'admin_'
- Как перенаправить, если отправлен заголовок?
я попытался сохранить параметр, используя
$url = $_GET['url']
проблема заключается в том, что страница подтверждения не отправляет ее в кодировку. и поэтому он распознает все, что заканчивается «&» в качестве начала нового параметра. Мне нужен способ разобрать URL-адрес таким образом, чтобы что-нибудь затягивало второе «?» является частью или переданным URL, а не фактическим запросом.
Получите полный запрос и затем извлеките его часть URL =
$name = http_build_query($_GET); $name = substr($name, strlen('URL='));
Ответ Антонио, вероятно, лучше всего. Также будет работать менее элегантный способ:
$url = $_GET['url']; $keys = array_keys($_GET); $i=1; foreach($_GET as $value) { $url .= '&'.$keys[$i].'='.$value; $i++; } echo $url;
Что-то вроде этого может помочь:
// 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]); } }
с// 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]); } }
Как вы намекнули в своем вопросе, кодировка URL-адреса, которую вы получаете, не такая, какая вы хотите: a &
отметит новый аргумент для текущего URL-адреса, а не тот, который url
параметре url
. Если URL-адрес был закодирован правильно, значение &
было бы экранировано как %26
.
Но, хорошо, учитывая, что вы точно знаете, что все, что указано после url=
, не экранировано и должно быть частью значения этого параметра, вы можете сделать это:
$url = preg_replace("/^.*?([?&]url=(.*?))?$/i", "$2", $_SERVER["REQUEST_URI"]);
Итак, если, например, текущий URL-адрес:
http://www.myhost.com/page.php?a=1&URL=http://www.domain2.com?foo=bar&test=12
Тогда возвращаемое значение:
http://www.domain2.com?foo=bar&test=12
Посмотрите, как работает eval.in.