有没有一种简单的方法可以获取请求的文件或目录而不带GET参数?例如,如果URL是http://example.com/directory/file.php?paramater=value
,我想返回http://example.com/directory/file.php
。我很惊讶在$_SERVER[]
中没有一个简单的索引。我错过了吗?
有没有一种简单的方法可以获取请求的文件或目录而不带GET参数?例如,如果URL是http://example.com/directory/file.php?paramater=value
,我想返回http://example.com/directory/file.php
。我很惊讶在$_SERVER[]
中没有一个简单的索引。我错过了吗?
(请点赞该答案以使其更加可见)。
The simplest solution would be:
echo parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
parse_url是一个内置的php函数,其唯一目的是从url中提取特定的组件,包括路径(第一个“?”之前的所有内容)。因此,它是我解决这个问题的新“最佳”解决方案。
Stackoverflow:如何删除查询字符串并仅获取url?
You can use strtok to get string before first occurence of ?
$url=strtok($_SERVER["REQUEST_URI"],'?');
性能注意事项: 这个问题也可以使用explode来解决。
将strtok应用于返回字符串中第一个字符实例之前的所有内容将比PHP中的任何其他方法都表现更好,但会在内存中保留查询字符串。
$_SERVER
变量的一些说明虽然OP没有询问,但我认为值得一提的是: 应该使用parse_url从url中提取任何特定组件,请参阅该函数的文档:
parse_url($actual_link, PHP_URL_SCHEME);
$_SERVER
变量是你的朋友,但它们是一个善变的朋友,因为apache/nginx配置、php环境甚至客户端都可能省略或更改这些变量。所有这些都超出了本问题的范围,但已经进行了深入讨论:
https://dev59.com/imw15IYBdhLWcg3wMY6L#6768831
重要的是要注意这些 $_SERVER
变量在运行时由执行引擎(/var/run/php/
或/etc/php/[version]/fpm/
)填充。这些变量从操作系统传递到web服务器(apache/nginx),再到php引擎,并在每个步骤中进行修改和修正。可以依靠的仅有的这些变量是 REQUEST_URI
(因为它是php所需的)和RFC 3875中列出的变量(请参见: PHP: $_SERVER),因为它们是web服务器所必需的。请注意: 在其他问题中垃圾邮件链接到您的答案是不好的方式。您可以使用$_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
explode()
限制为2个元素即可。 - Bradecho
parse_url
($_SERVER["REQUEST_URI"], PHP_URL_PATH);
下面是一种考虑到不同端口和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'];
我认为这不是解析它的好方法。它不够干净,或者有点离题...
我会做一些像这样的事情...
if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
假设$app_uri是我的网站的URI / URL。
$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;
我知道这是一个旧帖子,但我遇到了同样的问题,并且我是这样解决的
$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);
或者等价地
$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);
并不是每个人都会觉得它简单,但我认为这是最好的解决方法:
preg_match('/^[^\?]+/', $_SERVER['REQUEST_URI'], $return);
$url = 'http' . ('on' === $_SERVER['HTTPS'] ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $return[0]
parse_url
和/或 strtok
的优势吗? - Tony Chiboucasparse_url
已经清楚地记录在案,对于那些不熟悉正则表达式的人来说,在代码中更容易理解。explode
的性能更好,strtok
的性能最佳,而正则表达式是基准测试和php文档中最慢的选项。因此,我很好奇这个答案相比其他答案有什么优势? - Tony Chiboucas你可以使用$_GET
来获取URL参数,或者使用$_POST
来获取POST参数,但是$_REQUEST
包含了$_GET
、$_POST
和$_COOKIE
的所有参数。如果你想要隐藏URI参数,你可以将它转换为会话变量,像这样:
<?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']
获取当前文件名或者$_SERVER['REQUEST_URI']
获取请求的URI。
令人震惊的是,这些被投票/接受的答案中有多少是不完整的,因此它们没有回答问题,经过了7年!
如果您在一个URL为:http://example.com/directory/file.php?paramater=value
的页面上
...并且您想要返回:http://example.com/directory/file.php
那么使用:
echo $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
$_SERVER['PHP_SELF']
不可靠,不能像那样使用,因为在CGI/FCGI实施中它经常为空。 - Tony Chiboucas