0

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

所以基本上,我的本地主机 URL 是:

localhost/project/public/controller/action

实时版本将是:

www.example.com/controller/action

我最初的想法是只使用 $_SERVER['REQUEST_URI'] 它将在实时服务器上完美运行,但在我的本地主机上它会返回:

/project/public/controller/action

我需要的是:

controller/action

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

编辑:记录在案 - 这是我找到的答案 -如何在本地主机和实时服务器上获得相同的 $_SERVER['REQUEST_URI']

我也不能删除 /project/public/ 因为这个文件夹结构并不总是相同的。

所以我基本上需要获取路径直到 public/ 部分,但我什至不能使用它,因为 public 文件夹可能被称为其他东西。

我知道这一定是可能的,因为诸如 Laravel 之类的框架可以做到这一点,但即使查看源代码 - 我也无法弄清楚。

谢谢你的帮助。

编辑:可能的答案

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

我曾想过我可以在我的入口点运行 basename( DIR ),这将为我提供文件夹的名称,无论它是什么。然后,我可以使用它来删除(包括)该文件夹的第一个实例之前的所有内容。

我会试试这个,但如果有更优雅的解决方案,我仍然想听听。

4

1 回答 1

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'])));
于 2013-08-23T12:38:43.490 回答