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

kupeojn6  于 2023-03-11  发布在  PHP
关注(0)|答案(7)|浏览(148)

如果我的URL是http://www.server.com/myapp/stuff/to/see,磁盘上的目录结构是htdocs/myapp/*,我如何提取/myapp部分?另外,如果没有应用程序文件夹,应用程序根目录只是'/'呢?是否有预定义的变量来获取该值?
我想要的是一个能够从请求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,我想知道如何得到我上面问的。

eulz3vhy

eulz3vhy1#

当您使用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']

  • /something/htdocs/

$_SERVER['DOCUMENT_ROOT']

  • x1米11米1x

$_SERVER['REQUEST_URI']

  • /myapp/stuff/to/see/index.php

$_SERVER['SCRIPT_NAME']$_SERVER['PHP_SELF']

h5qlskok

h5qlskok2#

对于 *web根 *,有DOCUMENT_ROOT,正如在几个答案中指出的。对于 * 应用程序根 *,系统没有办法告诉您的应用程序中的哪个文件夹是根文件夹。您将不得不手动设置。
大多数使用单个入口点的应用程序使用此单个入口点文件中的__DIR__常量或配置设置定义应用程序根,并将其存储在整个应用程序中可用的常量中。

qco9c6ql

qco9c6ql3#

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

将下面的代码放在位于应用程序根文件夹中的文件中,并在每次页加载时包含它。
然后,无论本地副本是否在子目录folder中,您都可以简单地执行$path = ABSPATH . '/path/to/file.php';
如果您的应用程序已经有一个文件包含在每个页面加载中,您可以简单地将上面的代码放到该文件中,它就会工作。
请注意,根据文件的位置,您可能需要添加额外的dirname()调用。为从Web应用根目录传递的每个目录添加一个调用。
例如,如果您的webapp位于/webapp/中,而您的“global include”位于/webapp/includes/framework/init.php中,则需要对上述代码进行如下修改:

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

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

澄清

上面的代码应该在一个文件中,并且只在你的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()调用的数量。再次,这段代码是为了在只有一个文件。
然后获取URL路径,从ABSPATH中删除DOCUMENT_ROOT是一件简单的事情:

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

yiytaume4#

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

编辑

$_SERVER['REQUEST_URI']将始终从上面的示例url中为您提供/myapp/stuff/to/see,而不管文件在磁盘上的位置或从哪个文件调用它。
因此,这仅仅是explode输入、array_shift输入和implode输入的问题。
顺便说一句,从你的目录结构来看,你似乎在使用一个框架。一些框架有一个URI/URL库,你会发现它很有用(至少CodeIgniter有,其他框架不是100%肯定)

gtlvzcf8

gtlvzcf85#

试试这个:

echo dirname(__FILE__);

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

其他选项:

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

**一个

pnwntuvh

pnwntuvh6#

基本上,在PHP中,如果一个文件'A.php'使用相对路径来引用一个资源,那么作为相对路径前缀的当前路径位置是包含'A.php'的顶级父php的位置。
如果A.php本身是顶级父文件夹,或者A.php与顶级父文件夹位于同一个文件夹,这就不会有问题,但如果不是这样,就会中断导入。
我发现的最好的解决方案是通过使用DIR(它给出了文件的当前位置)使引用显式绝对化,然后从这个位置转到refered by,例如DIR."/../help.php”引用位于A.php之上一级的文件help.php。

cig3rfwq

cig3rfwq7#

bramus/router就是这样做的

function getBasePath()
{
    return implode('/', array_slice(explode('/', $_SERVER['SCRIPT_NAME']), 0, -1)) . '/';
}

更新:
为了澄清这一点,如果您只需要相对于上面getBasePath()的资源路径,那么您可以使用

function getBaseURI()
{
    $basePath = implode('/', array_slice(explode('/', $_SERVER['SCRIPT_NAME']), 0, -1)) . '/';
    // Get the current Request URI and remove rewrite base path from it (= allows one to run the router in a sub folder)
    $uri = substr(rawurldecode($_SERVER['REQUEST_URI']), strlen($basePath));

    // Don't take query params into account on the URL
    if (strstr($uri, '?')) {
        $uri = substr($uri, 0, strpos($uri, '?'));
    }

    // Remove trailing slash + enforce a slash at the start
    return '/' . trim($uri, '/');
}

如果您的.php文件在htdocs/myapp/中,当前URL为http://www.server.com/myapp/stuff/to/see

getBasePath() = /myapp/
getBaseURI()  = /stuff/to/see

如果您的.php文件在htdocs/中,当前URL为http://www.server.com/stuff/to/see

getBasePath() = /
getBaseURI()  = /stuff/to/see

相关问题