Проблемы с PHP с текущим URL - PullRequest
       0

Проблемы с PHP с текущим URL

2 голосов
/ 14 ноября 2011

Я использую функцию «Текущий URL», чтобы получить текущую ссылку, когда пользователь меняет язык страницы

$uri = explode('&', $_SERVER['REQUEST_URI']);
$uri = $uri[0];

$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$uri : "http://".$_SERVER['SERVER_NAME'].$uri;

Проблема в том, что когда у меня есть такая ссылка:

http://127.0.0.1/index.php?id=shop&id2=13&lang=lt

id2, конечно, исчезает.Что я могу сделать по этому поводу?Возможно, если для id2 установлено использование взорваться со вторым & или что-то в этом роде?

Ответы [ 4 ]

4 голосов
/ 14 ноября 2011

Вы можете использовать функцию parse_url , вот пример:

$uri = parse_url( $_SERVER['REQUEST_URI']);
$protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';
$url = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . '?' . ( isset( $uri['query']) ?  $uri['query'] : '');

Я не видел в вашем коде, где вы получаете имя файла скрипта, поэтому я использовал $_SERVER['SCRIPT_NAME'].

Редактировать: Моя ошибка, я не видел, что вам нужно манипулировать / удалить последний параметр $_GET.Вот пример того, как это сделать, используя метод, аналогичный описанному выше, в сочетании с parse_str .Обратите внимание, что этот метод будет работать независимо от расположения параметра lang, он не обязательно должен быть последним в строке запроса.

$protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://';

$params = array();
if( isset( $_SERVER['QUERY_STRING']) && !empty( $_SERVER['QUERY_STRING']))
{
    parse_str( $_SERVER['QUERY_STRING'], $params);
    $params['lang'] = 'anything';
    // unset( $params['lang']); // This will clear it from the parameters
}

// Now rebuild the new URL
$url = $protocol . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'] . ( !empty( $params) ? ( '?' . http_build_query( $params)) : '');

Спасибо @Yzmir Ramirez за улучшениевторая версия, которая устраняет посторонний вызов parse_url.

0 голосов
/ 14 ноября 2011

Вот код, который я всегда использовал, он также поддерживает порты.

$protocol = (!isset($_SERVER["HTTPS"]) || strtolower($_SERVER["HTTPS"]) == "off") ? "http://" : "https://";
$port = ((isset($_SERVER["SERVER_PORT"]) &&
    // http:// protocol defaults to port 80
    (($_SERVER["SERVER_PORT"] != "80" && $protocol == "http://") ||
    // https:// protocol defaults to port 443
    ($_SERVER["SERVER_PORT"] != "443" && $protocol == "https://")) &&
    // Port is not in http host (port is followed by : at end of address)
    strpos($_SERVER["HTTP_HOST"], ":") === false) ? ":" . $_SERVER["SERVER_PORT"] : '');

return $protocol . $_SERVER["HTTP_HOST"] . $port . $_SERVER["REQUEST_URI"];
0 голосов
/ 14 ноября 2011

Попробуйте это: http://codepad.org/cEKYTAp8

$uri = "http://127.0.0.1/index.php?id=shop&id2=13&lang=lt";

$uri = substr($uri, 0, strrpos($uri, '&'));

var_dump($uri); // output: string(41) "http://127.0.0.1/index.php?id=shop&id2=13"
0 голосов
/ 14 ноября 2011
$uri = explode('&', '/index.php?id=shop&id2=13&lang=lt');
$uri = $uri[0];
echo $uri; //echos /index.php?id=shop

Вы захотите использовать

$_SERVER['QUERY_STRING'] 

, чтобы получить только строку запроса.А если вы хотите сохранить все переменные, просто установите $ uri в значение разнесения, а затем просматривайте их с помощью foreach.

$uri = explode('&', $_SERVER['QUERY_STRING'];
foreach ($uri as $var_val) {
    $var_val = explode('=', $var_val);
    $var = $var_val[0];
    $val = $var_val[1];
}
...