【问题标题】:PHP problems with current url当前 url 的 PHP 问题
【发布时间】:2011-11-14 01:57:05
【问题描述】:

当用户更改页面语言时,我使用“当前网址”功能获取当前链接

$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 和第二个 & 或类似的东西,这可能吗?

【问题讨论】:

  • 你试过使用$_GET超级全局吗?如果是这样,您是否有某些原因不想使用它?
  • @jprofitt 我认为 OP 正在尝试删除最后一个 GET 变量。

标签: php explode


【解决方案1】:

你可以使用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 的无关调用。

【讨论】:

  • 我打算在回答中使用parse_str($_SERVER['QUERY_STRING']),但我更喜欢使用parse_url() 的解决方案。 +1
  • 您应该编辑您的答案,注意即使“lang”不是最后一个 GET 变量,您的解决方案也可以工作。
  • 好点@YzmirRamirez - 一个改进可能是删除对parse_url 的调用并只使用$_SERVER['QUERY_STRING']
【解决方案2】:
$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];
}

【讨论】:

    【解决方案3】:

    试试这个: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"
    

    【讨论】:

      【解决方案4】:

      这是我一直用的代码,它也支持ports。

      $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"];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-01
        • 2023-03-12
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        相关资源
        最近更新 更多