使用PHP';本地主机上的s$_服务器[';请求&#URI';]以获取查询字符串-可选?

使用PHP';本地主机上的s$_服务器[';请求&#URI';]以获取查询字符串-可选?,php,frameworks,localhost,url-routing,Php,Frameworks,Localhost,Url Routing,我目前正在构建一个简单的MVC框架,在本地主机上分解URL,但在实时生产服务器上也能工作方面遇到了一些障碍 因此,我的本地主机URL基本上是: localhost/project/public/controller/action 现场版本将是: www.example.com/controller/action 我最初的想法是只使用$\u SERVER['REQUEST\u URI'],它可以在实时服务器上完美工作,但在我的本地主机上它会返回: /project/public/control

我目前正在构建一个简单的MVC框架,在本地主机上分解URL,但在实时生产服务器上也能工作方面遇到了一些障碍

因此,我的本地主机URL基本上是:

localhost/project/public/controller/action
现场版本将是:

www.example.com/controller/action
我最初的想法是只使用$\u SERVER['REQUEST\u URI'],它可以在实时服务器上完美工作,但在我的本地主机上它会返回:

/project/public/controller/action
我需要的是:

controller/action
我已经搜索过了,我能找到的唯一答案是设置一个虚拟主机,而我并不真的想这样做——这段代码将在可能知道或不知道如何设置的人之间共享,因此如果可能的话,我希望避免这样做

编辑:记录-这是我找到的答案-

我也无法删除/project/public/,因为此文件夹结构并不总是相同的

所以我基本上需要得到路径,直到公共/部分,但我甚至不能使用它,因为公共文件夹可能被称为其他东西

我知道这一定是可能的,因为像Laravel这样的框架可以做到这一点,但即使从源代码上看,我也不太清楚

谢谢你的帮助

编辑:可能的答案

奇怪的是,一旦你发布了一些东西,你就会有一个脑电波

我一直认为我可以在我的入口点运行basename(DIR),它将为我提供文件夹的名称,而不管它是什么。然后,我可以使用它删除该文件夹第一个实例之前(包括中)的所有内容

我会尝试一下,但如果有更优雅的解决方案,我还是想听听

我也无法删除/project/public/,因为此文件夹结构并不总是相同的

但我想,你总是会有
控制器
动作
部分?如果是,则执行以下操作:

$uriParts = explode('/', $_SERVER['REQUEST_URI']);
$count = count($uriParts);
$controller = isset($uriParts[$count - 2]) ? $uriParts[$count - 2] : null;
$action = isset($uriParts[$count - 1]) ? $uriParts[$count - 1] : null;
尝试此操作以从您的
请求\u URI
中获取结束字符串,该字符串不属于服务器路径的一部分:

substr($_SERVER['REQUEST_URI'], strlen(dirname($_SERVER['SCRIPT_NAME'])));

不幸的是,URL并不总是这样组成的——例如,我可能没有控制器或操作,而是为该URL设置了路由。动作后还会有更多的参数,所以恐怕计数不会真正减少。感谢您的回答。在这种情况下,请查看
$\u SERVER
中的其他值-因为(我假设)每个请求都经过bootstrap index.php,您可以找到它的位置并将其与
$\u SERVER['request\u URI']
进行比较-这将允许您简单地“剪切”事实文件夹中的所有部分,而不是“干净的url”部分,我会在一分钟内给你举个例子。我在前面的评论中的意思或多或少是你在
编辑:可能的答案
现在-这应该是一个很好的方法,只需一行就可以完成。试试这个:
substr($\u SERVER['REQUEST\u URI'],strlen(dirname($\u SERVER['SCRIPT\u NAME'))