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

如何将PHP应用程序与需要在文档根目录下运行的应用程序分离?,php,relative-path,absolute-path,Php,Relative Path,Absolute Path,目前,我们的PHP应用程序需要在web服务器的文档根目录中设置(通常通过配置Apache的虚拟主机) 这种依赖性的主要原因是我们的URL生成逻辑假设所有URL都可以通过绝对路径/访问。这使得链接到图像和页面等资源变得容易 用户可能从不同的子文件夹访问应用程序,因此我们不能假定一个简单的相对路径来工作 我们如何将应用程序与需要在web服务器的文档根目录中运行的应用程序分离?您是否建议在URL控制器中解析$\u服务器['DOCUMENT\u ROOT'],以尝试确定文件在文件系统中的访问深度?现在,

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

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

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


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

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

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

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

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

  • 请注意,如果脚本位于应用程序根目录下,则下面计算的$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);}
我希望这有帮助

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

$rootPath = str_replace('\\','/',dirname(__FILE__)).'/';
并在您的应用程序中使用它进行文件访问和包含。作为奖励,您可以在不破坏文件关系的情况下移动整个应用程序。

我看到两个选项:

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

  • 使用,需要一些高级git


  • 我发现PHP只是在文件夹中运行站点时出现问题的一部分;CSS->图像引用是可怕的相对链接。啊,这是真的,路径是相对于调用CSS文件的URL。这一直是一个烦恼:)@Jack尽管在css中使用相对链接确实不那么直观,但这肯定是可能的。通常出现问题的原因是,如果使用的是文件,特别是css文件,则结构不清楚。清理项目布局,事情变得容易多了。事实上,将web应用锚定到其安装路径并不是一件小事。单纯解析请求不会提供令人满意的信息。这是通常的做法:在应用程序配置中定义“基本路径”。该配置要么在安装应用程序时被显式编辑(可靠、灵活,但令人讨厌),要么由应用程序本身通过“首次运行”wizzard生成。我发现后者被广泛接受,尽管从技术角度看它并不优雅。你有一个index.php来服务所有页面吗?谢谢你提供的信息。我可以理解为什么当前脚本“知道”它的位置会很有用。然而,我更喜欢只做
    require _DIR _.'//例如,包括/config.php'
    (只需硬编码站点的一般包括。同样,我仍然会有一个
    .htaccess
    文件的复杂性,该文件依赖于对内部uri的重定向,假设我们在顶级URL上工作。很抱歉误解了您的问题。我希望您能找到一个好的解决方案。也许在通过uri访问的每个条目根目录中,您可以放置一个脚本。)wing“正确的方式”并包含为“/wheremi.php”?我知道,你的应用程序看起来不优雅,可能有太多的入口点。在服务器上设置环境变量并从那里读取目录位置如何?是的,你是对的。我认为设置环境变量是比使用配置文件更好的方法。即使这样,我仍然会使用
    .htaccess
    问题,因为它不知道它的“位置”,没有硬编码
    BaseUrl
    (或者类似的变量,我记不得了)。
    $rootPath = ($p > 0)? substr($curPath, 0, $p-1): '/';
    
    $rootPath = str_replace('\\','/',dirname(__FILE__)).'/';