代码之家  ›  专栏  ›  技术社区  ›  scottm

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

php
  •  21
  • scottm  · 技术社区  · 14 年前

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

    我想要的是一个可以修剪的函数 /MyAPP 离开请求的URI,这样我只剩下 /stuff/to/see . 而且,如果我要将应用程序移动到服务器文档根目录,也要让它确定这一点(以便 东西/看/看 只是作为 东西/看/看 )

    我的目录结构是:

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

    所以,从index.php,我想知道如何得到我上面要求的。

    6 回复  |  直到 9 年前
        1
  •  12
  •   Pekka    14 年前

    对于 网根 DOCUMENT_ROOT 正如一些答案所指出的。对于 应用程序根 ,系统无法判断应用程序中的哪个文件夹是根文件夹。您必须手动设置。

    大多数应用程序使用 dirname(__FILE__); 或者配置设置,并将其存储在应用程序中可用的常量中。

        2
  •  16
  •   poke    14 年前

    当您使用 http://www.server.com/myapp/stuff/to/see ,并且您的Web服务器的文档根位于 /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']
    • /某物/htdocs/
      $_SERVER['DOCUMENT_ROOT']
    • /myapp/stuff/to/see
      $_SERVER['REQUEST_URI']
    • /myapp/stuff/to/see/index.php
      $_SERVER['SCRIPT_NAME'] $_SERVER['PHP_SELF']
        3
  •  3
  •   Andrew Moore    14 年前
    <?php
    define('ABSPATH', dirname(__FILE__));
    

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

    那么,你可以一直这样做 $path = ABSPATH . '/path/to/file.php'; 无论本地副本是否在子目录中 folder 或者没有。


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

    请注意,您可能需要添加其他 dirname() 根据文件所在位置调用。为从webapp根目录传递的每个目录添加一个。

    例如,如果您的webapp位于 /webapp/ 您的“全球包含”位于 /webapp/includes/framework/init.php ,则需要修改上述代码:

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

    即:增加2个 DrimeNe() 来自webapp根目录的另外两个文件夹导致的调用( includes/framework )


    澄清

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

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

    DrimeNe() 调用取决于您复制和粘贴的文件的深度 中的代码与Web应用程序的根目录相关。对于上面的示例,假设Web应用程序的根由 ~ .

    如果你复制粘贴我的代码到 ~/abspath.php ,那么你需要一个 DrimeNe() 打电话。

    如果你复制粘贴我的代码到 ~/includes/abspath.php ,那么你需要两个 DrimeNe() 电话。

    如果你复制粘贴我的代码到 ~/includes/config/abspath.php ,那么你需要三个 目录名() 电话。现在我们假设这是它的最终位置。

    ~/index.php ,请执行以下操作:

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

    你有权 ABSPATH .

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

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

    你有权 阿布斯特 .

    这就是为什么我要说的是,如果您已经有了一个包含在每个页面加载中的文件,那么将上面的代码放到其中就更简单了。只需确保修改 DrimeNe() 相应地调用。同样,此代码只存在于一个文件中。


    然后获取URL路径,这是一个简单的删除 DOCUMENT_ROOT 绝对路径 :

    $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
    define('RELADDR', substr(ABSPATH, strlen($docRoot));
    
        4
  •  1
  •   widyakumara    14 年前

    $_SERVER['DOCUMENT_ROOT'] 会给你htdocs的路径,然后你就可以从那里走了

    编辑

    $_SERVER['REQUEST_URI'] 会一直给你 /myapp/stuff/to/see 从上面的示例URL,不管文件在磁盘上的位置或从哪个文件调用它。

    所以这只是一个问题 explode 惯性导航与制导, array_shift implode 惯性导航与制导。

    顺便说一句,从您的目录结构来看,您似乎正在使用一个框架。有些框架有一个你可以发现有用的URI/URL库(至少CodeIgniter有,而不是100%确定其他框架)。

        5
  •  0
  •   Sarfraz    14 年前

    试试这个:

     echo dirname(__FILE__);
    

    哪里 __FILE__ 是当前正在执行的脚本的名称,并且 dirname 从中获取文件夹/应用程序文件夹。

    更多选择:

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

    On PHP.net

        6
  •  0
  •   saurabh.in    9 年前

    我也遇到了类似的问题。基本上,在php中,如果文件“a.php”使用相对路径引用资源,那么作为相对路径前缀的当前路径位置是包含“a.php”的顶级父php。

    如果a.php本身是顶级父级,或者a.php与顶级父级位于同一文件夹中,那么这不会是问题。但是它会破坏进口。

    我找到的最佳解决方案是通过使用 目录 (给出文件的当前位置),然后从该位置转到引用者,例如 迪尔 .“/../help.php”指位于a.php以上1级的文件help.php。