在localhost上使用PHP的$ _SERVER ['REQUEST_URI']获取查询字符串 - 替代?

时间:2013-08-23 12:31:07

标签: php frameworks localhost url-routing

我目前正在构建一个简单的MVC框架,我在打破本地主机上的URL方面遇到了一些障碍,但也让它在现场生产服务器上工作。

基本上,我的localhost URL是:

localhost/project/public/controller/action

现场版将是:

www.example.com/controller/action

我最初的想法是只使用$ _SERVER ['REQUEST_URI'],这将在现场服务器上完美运行,但在我的localhost上它会返回:

/project/public/controller/action

我需要的是:

controller/action

我已经进行了搜索,我找到的唯一答案是设置一个我不想做的虚拟主机 - 这些代码将在可能知道或可能不知道如何设置的人之间共享如果可能的话,我想避免它。

编辑:为了记录 - 这是我找到的答案 - How to get the same $_SERVER['REQUEST_URI'] on both localhost and live server

我也无法删除/ project / public /,因为这个文件夹结构并不总是一样。

所以我基本上需要在公共/部分之前获取路径,但我甚至无法使用它,因为公共文件夹可能被称为其他东西。

我知道这一定是可能的,因为像Laravel这样的框架可以做到,但即使查看源代码 - 我也无法理解它。

感谢您的帮助。

编辑:可能的答案

你发布一些东西时,你经常会有多少脑电波,这很奇怪......

我已经想到我可以在我的入口点运行basename( DIR ),无论它是什么,它都会给我文件夹的名称。然后,我可以使用它来删除该文件夹的第一个实例(包括)之前的所有内容。

我会试试这个,但如果有更优雅的解决方案,我仍然希望听到它们。

1 个答案:

答案 0 :(得分:1)

  

我也无法删除/ project / public /,因为这个文件夹结构并不总是一样。

但我认为,您将始终拥有controlleraction部分?如果是,那么这样做:

$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;

尝试此操作从REQUEST_URI获取不属于服务器路径的结束字符串:

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