有没有一种简单的方法来获取没有GET参数的请求文件或目录?例如,如果网址为http://mysite.com/directory/file.php?paramater=value
,我只想返回http://mysite.com/directory/file.php
。我很惊讶$_SERVER[]
中没有简单的索引。我错过了吗?谢谢!
答案 0 :(得分:71)
(请注意这个答案,以便更加明显)。
最简单的解决方案是:
echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
Parse_url是一个内置的php函数,其唯一目的是从URL中提取特定组件,包括PATH
(第一个?
之前的所有内容)。因此,这是我解决这个问题的新“最佳”解决方案。
Stackoverflow: How to remove the querystring and get only the url?
您可以使用strtok在第一次出现之前获取字符串?
$url=strtok($_SERVER["REQUEST_URI"],'?');
效果说明: 使用explode也可以解决此问题。
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
另一种替代方法here。
答案 2 :(得分:31)
解决方案:
echo
parse_url
($_SERVER["REQUEST_URI"], PHP_URL_PATH);
答案 3 :(得分:2)
我实际上认为这不是解析它的好方法。它不干净,或者有点不受欢迎......
我会做类似......
if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_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']; ?>?">
注意最后的问号。我相信这告诉机器不再代表编码器思考:)