目前,我们的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__)).'/';
并在整个应用程序中使用它进行文件访问和包含。作为奖励,您可以在不破坏其文件关系的情况下移动整个应用程序。
我看到两个选项:
-
重构现有程序以通过单个脚本路由所有请求(如上所述,但这对我们的项目不实用)
-
使用污迹和干净的属性过滤器,需要一些相对高级的数字。