相对路径-如何将PHP应用程序从需要在文档根中运行中解耦


relative path - How would you decouple a PHP app from needing to be run in document root?

目前,我们的PHP应用程序需要在web服务器的文档根目录中进行设置(通常通过配置Apache的虚拟主机)。

这种依赖性的主要原因是,我们的URL生成逻辑假设所有URL都可以通过绝对路径/访问。这样可以方便地链接到图像和页面等资源。

用户可能从不同的子文件夹访问应用程序,因此我们不能假设一个简单的相对工作路径。

我们如何将应用程序与需要在web服务器的文档根目录中运行脱钩?您是否建议解析该URL控制器中的$_SERVER['DOCUMENT_ROOT'],以尝试决定文件系统中访问该文件的位置?现在,我看不出有什么确切的解析方法。另外一个复杂的问题是,我们使用Apache的ReReRewrite,所以URL不一定与文件系统匹配。

我通常使用简单而愚蠢的方法来实现这一目的,比如:

如果用户可以从应用程序的不同入口点进行不确定的访问,那么入口点应该知道相对于应用程序根的"他们在哪里"。

首先,我应该知道我当前脚本w.r.应用程序根的相对位置,所以我静态地写入脚本,即;对于应该在的脚本

...approotdirname/appsubdir1name/appsubdir2name/here.php

$relPath = 'approotdirname/appsubdir1name/appsubdir2name';
  • 请注意,如果您的脚本位于应用程序根目录,则下面计算的$curPath将直接是您在服务器上的应用程序位置

第二,我应该从Php学习当前的脚本文件路径,使用统一的格式:

$curPath = str_replace('''','/',dirname(__FILE__));

(str_replace用于在存在''的情况下将其替换为/。)事实上,$relPath的副本(如果配置正确)应该存在于$curPath的末尾。

然后我会在$curPath:中找到$relPath的位置

$p = stripos($curPath, $relPath, 0);
if(($p === false)||($p < 0)){echo "Relative path: $relPath is invalid."; exit(0);}

现在,当我们从$curPath中减去$relPath时,我们只需检查一下,就可以得到我们的应用程序根在服务器上的位置。

$rootPath = ($p > 0)? substr($curPath, 0, $p-1): '/';

我希望这能有所帮助。

请注意,通过应用程序根目录下的index.php等单点限制用户访问通常被认为是一种更好的做法。在入口点你可以得到

$rootPath = str_replace('''','/',dirname(__FILE__)).'/';

并在整个应用程序中使用它进行文件访问和包含。作为奖励,您可以在不破坏其文件关系的情况下移动整个应用程序。

我看到两个选项:

  1. 重构现有程序以通过单个脚本路由所有请求(如上所述,但这对我们的项目不实用)

  2. 使用污迹和干净的属性过滤器,需要一些相对高级的数字。