0

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

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

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

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

4

2 回答 2

1

为此,我通常使用简单而愚蠢的方法,例如:

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

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

...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__)).'/';

并通过您的应用程序将其全部用于文件访问和包含。作为奖励,您可以在不破坏其文件关系的情况下移动整个应用程序。

于 2013-02-21T09:04:18.897 回答
0

我看到两个选项:

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

  2. 使用涂抹和清洁属性过滤器,需要一些相对高级的 git。

于 2013-02-24T06:12:28.143 回答