你如何将PHP应用程序与需要在文档根目录中运行分离?

时间:2013-02-21 08:02:03

标签: php relative-path absolute-path

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

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

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

我们如何将应用程序与需要在Web服务器的文档根目录中运行分离?您是否建议在该URL控制器中解析$_SERVER['DOCUMENT_ROOT']以尝试确定文件系统在文件系统中的访问距离?现在,我没有看到这种解析的可靠方法。另外一个复杂因素是我们使用Apache的ReRewrite,因此URL不一定与文件系统匹配。

2 个答案:

答案 0 :(得分:1)

我通常为此目的使用Simple和Stupid方法,如:

如果用户可以从应用程序的不同入口点不确定地访问,则入口点应该知道相对于应用程序根目录的“它们在哪里”。

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

的脚本
...approotdirname/appsubdir1name/appsubdir2name/here.php

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

其次,我应该以统一的格式学习Php的当前脚本文件路径:

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

(str_replace用于替换\ with /以防它们存在。)  事实上,$ 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 :(得分:0)

我看到两个选项:

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

  2. 使用smudge and clean attribute filters,需要一些相对高级的git。