不带 GET 参数的请求字符串 parse_url解决方案 strtok solution把它们放在一起:

2022-08-30 09:12:53

有没有一种简单的方法可以在没有GET参数的情况下获取请求的文件或目录?例如,如果URL是,我只想返回。我很惊讶,在.我错过了一个吗?http://example.com/directory/file.php?paramater=valuehttp://example.com/directory/file.php$_SERVER[]


答案 1

编辑:@T.Todua使用parse_url为这个问题提供了更新的答案

(请为该答案投赞成票,以便它更明显)。

编辑2:有人一直在发送有关提取方案的垃圾邮件和编辑,所以我在底部添加了它。

parse_url解决方案

最简单的解决方案是:

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

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

strtok solution

堆栈溢出:如何删除查询字符串并仅获取 url?

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

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

性能说明:这个问题也可以使用爆炸来解决。

  • 对于仅在单个分隔符上拆分背带的情况,分解往往表现更好。
  • Strtok 对于使用多个分隔符的情况往往表现得更好。

在字符的第一个实例之前,strtok的应用程序将比PHP中的任何其他方法更好地执行strtok,尽管会将查询字符串保留在内存中。

关于 Scheme (http/https) 和 vars 的旁白$_SERVER

虽然OP没有询问它,但我认为值得一提的是:parse_url应该用于从URL中提取任何特定组件,请参阅该函数的文档:

parse_url($actual_link, PHP_URL_SCHEME); 

这里需要注意的是,从请求中获取完整的URL并不是一件容易的事,并且具有许多安全隐患。 变量是你的朋友,但它们是一个善变的朋友,因为apache /nginx配置,php环境,甚至客户端,都可以省略或改变这些变量。所有这些都远远超出了这个问题的范围,但它已经被彻底讨论过了:$_SERVER

https://stackoverflow.com/a/6768831/1589379

请务必注意,这些变量是在运行时由执行 ( 或 ) 的任何引擎填充的。这些变量从操作系统传递到Web服务器(apache/nginx)再到php引擎,并在每个步骤中进行修改和修正。唯一可以依赖的此类变量是(因为php需要它),以及RFC 3875中列出的变量(参见:PHP:$_SERVER),因为它们是Web服务器所必需的。$_SERVER/var/run/php//etc/php/[version]/fpm/REQUEST_URI

请注意:在其他问题上,垃圾邮件链接到您的答案并不好。


答案 2

您可以使用 来获取请求的路径。然后,您需要删除参数...$_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 — 服务器和执行环境信息
  • 分解 — 将字符串拆分为字符串
  • parse_url — 解析 URL 并返回其组件(可能是更好的解决方案)

推荐