如何从PHP获取我的URL的“应用程序根目录”?

时间:2010-02-22 15:40:35

标签: php

如果我的网址为http://www.server.com/myapp/stuff/to/see且磁盘上的目录结构为htdocs/myapp/*,我该如何提取/myapp部分?如果没有应用程序文件夹且应用程序root只是'/',该怎么办?是否有预定义的变量来获取该值?

我想要的是一个能够从请求URI中删除/myapp的函数,这样我只剩下/stuff/to/see。并且,如果我要将应用程序移动到服务器文档根目录,请同时确定它(以便/stuff/to/see只返回/stuff/to/see

我的目录结构是:

application
  |-config
    |-config.inc.php
library
  |-autoload.class.php
public
  |-css
  |-img
index.php

所以,从index.php开始,我想知道如何得到我上面提到的内容。

6 个答案:

答案 0 :(得分:16)

当您使用http://www.server.com/myapp/stuff/to/see访问某个网页时,您的网络服务器的文档根位于/something/htdocs/,那么当前的local路径为/something/htdocs/myapp/stuff/to/see

现在没有明确的解决方案可以获得/something/htdocs/myapp/,因为没有明确的定义你应该获得路径。如果你有一些规则,请告诉我们,我们可能会想出一些东西,但是如果没有计算,你可以看到的唯一途径是:

  • http://www.server.com/myapp/stuff/to/see
    $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
  • /something/htdocs/myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_FILENAME']
  • /something/htdocs/
    $_SERVER['DOCUMENT_ROOT']
  • /myapp/stuff/to/see
    $_SERVER['REQUEST_URI']
  • /myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_NAME']$_SERVER['PHP_SELF']

答案 1 :(得分:12)

对于 web root ,在几个答案中指出了DOCUMENT_ROOT。对于应用程序根,系统无法告知应用程序中的哪个文件夹是根文件夹。您必须手动设置。

大多数应用程序使用dirname(__FILE__);或配置设置定义应用程序根目录,并将其存储在整个应用程序中可用的常量中。

答案 2 :(得分:3)

<?php
define('ABSPATH', dirname(__FILE__));

将以下代码放在位于应用程序根文件夹中的文件中,并将其包含在每个页面加载中。

然后,无论您的本地副本是否位于子目录$path = ABSPATH . '/path/to/file.php';中,您都可以随时folder


如果您的应用程序已经有一个文件包含在每个页面加载中,您只需将上面的代码放在该文件中即可。

请注意,您可能需要添加其他dirname()来电,具体取决于该文件的位置。为从webapp的根目录传递的每个目录添加一个。

例如,如果您的网络应用位于/webapp/而您的“全局包含”位于/webapp/includes/framework/init.php,则上述代码需要进行修改:

define('ABSPATH', dirname(dirname(dirname(__FILE__))));

即:由于来自webapp根目录的两个额外文件夹(dirname()),还有2个includes/framework次调用


<强>澄清

上面的代码只能在一个文件中,而一个文件只在您的Web应用程序中。该文件需要包含在每个页面加载中。

如果您已经有任何处理之前包含的文件(例如配置文件或其他文件),您可以将该代码复制并粘贴到该文件中。

dirname()来电的数量取决于您复制和粘贴文件的深度 代码相对于Web应用程序的根目录。对于上面的示例,假设您的Web应用程序的根由~表示。

如果您将我的代码复制粘贴到~/abspath.php,那么您需要进行一次dirname()来电。

如果您将我的代码复制粘贴到~/includes/abspath.php,那么您需要进行两次dirname()次调用。

如果您将我的代码复制粘贴到~/includes/config/abspath.php,那么您需要进行三次dirname()次调用。现在让我们说这是它的最终位置。

~/index.php中,您可以执行以下操作:

<?php
require_once('includes/config/abspath.php');

您可以访问ABSPATH

~/dir/someOtherPage.php中,您可以执行以下操作:

<?php
require_once('../includes/config/abspath.php');

您可以访问ABSPATH

这就是为什么我说如果你已经有一个文件包含在每个页面加载,更简单的只是删除上面的代码。只需确保相应地修改dirname()次呼叫的数量。同样,这段代码只能在一个文件中。


然后获取网址路径,只需删除DOCUMENT_ROOT FROM ABSPATH

$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
define('RELADDR', substr(ABSPATH, strlen($docRoot));

答案 3 :(得分:1)

$_SERVER['DOCUMENT_ROOT']将为您提供htdocs的路径,然后您可以从那里开始

修改

$_SERVER['REQUEST_URI']将始终从上面的示例网址中提供/myapp/stuff/to/see,无论磁盘上的文件位置或调用该文件的位置如何。

所以只需要explodearray_shiftimplode

从您的目录结构来看,它看起来像是在使用框架。一些框架有一个你可以发现有用的URI / URL库(至少CodeIgniter有,而不是100%肯定与其他框架)

答案 4 :(得分:0)

试试这个:

 echo dirname(__FILE__);

其中__FILE__是当前执行脚本的名称,dirname获取文件夹/应用程序文件夹。

更多选项:

echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir

<强> On PHP.net

答案 5 :(得分:0)

我遇到了类似的问题。基本上,在PHP中如果一个文件&#39; A.php&#39;使用相对路径来引用资源,然后用作相对路径的前缀的当前路径位置是顶级父php,其中&#39; A.php&#39;包括在内。

如果A.php本身是顶级父级,或者当A.php与其顶级父级位于同一文件夹中时,这不会成为问题。但它会打破进口。

我发现的最佳解决方案是通过使用 DIR (它提供文件的当前位置)然后从此位置转到引用来明确绝对参考。的 DIR &#34; /../ help.php&#34;引用文件help.php,坐在A.php上方1层。