请求PHP中没有GET参数的字符串

时间:2012-02-29 18:28:13

标签: php http web

有没有一种简单的方法来获取没有GET参数的请求文件或目录?例如,如果网址为http://mysite.com/directory/file.php?paramater=value,我只想返回http://mysite.com/directory/file.php。我很惊讶$_SERVER[]中没有简单的索引。我错过了吗?谢谢!

12 个答案:

答案 0 :(得分:71)

编辑: @ T.Todua 使用parse_url提供了更新的answer to this question

(请注意这个答案,以便更加明显)。

parse_url解决方案

  

最简单的解决方案是:

echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

Parse_url是一个内置的php函数,其唯一目的是从URL中提取特定组件,包括PATH(第一个?之前的所有内容)。因此,这是我解决这个问题的新“最佳”解决方案。

strtok解决方案

Stackoverflow: How to remove the querystring and get only the url?

  

您可以使用strtok在第一次出现之前获取字符串?

$url=strtok($_SERVER["REQUEST_URI"],'?');

效果说明: 使用explode也可以解决此问题。

  • 对于仅在单个分隔符上拆分sring的情况,爆炸倾向于表现更好。
  • 对于使用多个分隔符的案例,Strtok往往表现更好。

strtok的这个应用程序在字符的第一个实例之前返回字符串中的所有内容将比PHP中的任何其他方法执行得更好,但会将查询字符串保留在内存中。

答案 1 :(得分:48)

您可以使用$_SERVER['REQUEST_URI']获取请求的路径。然后,您需要删除参数...

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);

然后,添加主机名和协议。

echo 'http://' . $_SERVER['HTTP_HOST'] . $uri_parts[0];

如果混合http:https://,您还必须检测协议。 我作为练习留给你。 $_SERVER['REQUEST_SCHEME']返回协议。


  

全部放在一起:

echo $_SERVER['REQUEST_SCHEME'] .'://'. $_SERVER['HTTP_HOST'] 
     . explode('?', $_SERVER['REQUEST_URI'], 2)[0];
     

...返回,例如:

     

http://example.com/directory/file.php


php.com文档:

  • $_SERVER - 服务器和执行环境信息
  • explode - 按字符串
  • 拆分字符串
  • parse_url - 解析网址并返回其组件(替代解决方案)

另一种替代方法here

答案 2 :(得分:31)

解决方案:

echo parse_url ($_SERVER["REQUEST_URI"], PHP_URL_PATH);

答案 3 :(得分:2)

我实际上认为这不是解析它的好方法。它不干净,或者有点不受欢迎......

  • 爆炸很重
  • 会话很重
  • PHP_SELF不处理URLRewriting

我会做类似......

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • 检测是否存在实际的'?' (GET标准格式)
  • 如果没关系,那么在'?'之前削减我们的变量这是为获取数据而保留的

将$ app_uri视为我网站的URI /网址。

答案 4 :(得分:2)

这是一个考虑了不同端口和https的解决方案:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';

if ($_SERVER['SERVER_PORT'] != '80')
  $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF'];
else 
  $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];  

或者更基本的解决方案,不考虑其他端口:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 

答案 5 :(得分:1)

令人震惊的是,这些被接受/接受的答案中有多少是不完整的,因此7年后他们没有回答OP的问题!

  • 如果您使用的网址是http://example.com/directory/file.php?paramater=value

  • ...,您只想返回:http://example.com/directory/file.php

  • 然后使用:

      

    echo $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];

答案 6 :(得分:0)

您可以将$_GET用于url参数,或$_POST用于post params,但$_REQUEST包含来自$_GET $_POST和{{1}的参数如果你想隐藏用户的URI参数,你可以将它转换为会话变量,如下所示:

$_COOKIE

编辑

使用<?php session_start(); if (isset($_REQUEST['param']) && !isset($_SESSION['param'])) { // Store all parameters received $_SESSION['param'] = $_REQUEST['param']; // Redirect without URI parameters header('Location: /file.php'); exit; } ?> <html> <body> <?php echo $_SESSION['param']; ?> </body> </html> 获取当前文件名,或使用$_SERVER['PHP_SELF']获取请求的URI

答案 7 :(得分:0)

为什么这么复杂? =)

$baseurl = 'http://mysite.com';
$url_without_get = $baseurl.$_SERVER['PHP_SELF'];

这应该真的是男人;)

答案 8 :(得分:0)

不是每个人都会觉得这很简单,但我相信这是解决问题的最好方法:

preg_match('/^[^\?]+/', $_SERVER['REQUEST_URI'], $return);
$url = 'http' . ('on' === $_SERVER['HTTPS'] ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $return[0]


什么是简单地从字符串的开头经过REQUEST_URI,然后当它到达&#34时停止?&#34; (实际上,只有当你得到参数时才会发生。)

然后创建网址并将其保存到$ url:
创建$ url时......我们正在做的只是写&#34; http&#34;然后检查是否正在使用https,如果是,我们也会编写&#34; s&#34;,然后我们连接&#34;://&#34;,连接HTTP_HOST(服务器,fx:&# 34; stackoverflow.com&#34;),并将我们之前发现的$ return连接到它(它是一个数组,但我们只想要它中的第一个索引......只能有一个index,因为我们正在检查正则表达式中字符串的开头。)。

我希望有人能用这个...

PS。在使用SLIM重新路由URL时,已经确认这可以正常工作。

答案 9 :(得分:0)

我知道这是一篇过时的文章,但是我遇到了同样的问题,因此我以这种方式解决了

$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);

或等效地

$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);

答案 10 :(得分:0)

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;

答案 11 :(得分:-2)

当我想要一个返回主页的链接时,我遇到了同样的问题。我试过这个并且有效:

<a href="<?php echo $_SESSION['PHP_SELF']; ?>?">

注意最后的问号。我相信这告诉机器不再代表编码器思考:)