目前我们的PHP应用程序需要在Web服务器的文档根目录中设置(通常通过配置Apache的虚拟主机)。
这种依赖性的主要原因是我们的URL生成逻辑假定可以通过绝对路径/
访问所有URL。这样可以轻松链接到图像和页面等资源。
用户可能正在从不同的子文件夹访问应用程序,因此我们无法假设一个简单的相对路径。
我们如何将应用程序与需要在Web服务器的文档根目录中运行分离?您是否建议在该URL控制器中解析$_SERVER['DOCUMENT_ROOT']
以尝试确定文件系统在文件系统中的访问距离?现在,我没有看到这种解析的可靠方法。另外一个复杂因素是我们使用Apache的ReRewrite,因此URL不一定与文件系统匹配。
答案 0 :(得分:1)
我通常为此目的使用Simple和Stupid方法,如:
如果用户可以从应用程序的不同入口点不确定地访问,则入口点应该知道相对于应用程序根目录的“它们在哪里”。
首先,我应该知道我当前脚本的相对位置。应用程序root所以我静态写入脚本,即; 对于应该在
的脚本...approotdirname/appsubdir1name/appsubdir2name/here.php
$relPath = 'approotdirname/appsubdir1name/appsubdir2name';
其次,我应该以统一的格式学习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)
我看到两个选项:
重构现有程序以通过单个脚本路由所有请求(上面建议,但这对我们的项目不实用)
使用smudge and clean attribute filters,需要一些相对高级的git。