我使用“当前网址”功能在用户更改网页语言时获取当前链接
$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
设置为使用 explode 并使用第二个&
或类似的内容,则可能会这样做吗?
答案 0 :(得分:4)
您可以使用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
的无关呼叫。
答案 1 :(得分:0)
$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];
}
答案 2 :(得分:0)
试试这个: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"
答案 3 :(得分:0)
这是我一直使用的代码,它也支持端口。
$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"];