如果我的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,我想知道如何得到我上面问的。
7条答案
按热度按时间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']
$_SERVER['REQUEST_URI']
/myapp/stuff/to/see/index.php
$_SERVER['SCRIPT_NAME']
和$_SERVER['PHP_SELF']
h5qlskok2#
对于 *web根 *,有
DOCUMENT_ROOT
,正如在几个答案中指出的。对于 * 应用程序根 *,系统没有办法告诉您的应用程序中的哪个文件夹是根文件夹。您将不得不手动设置。大多数使用单个入口点的应用程序使用此单个入口点文件中的
__DIR__
常量或配置设置定义应用程序根,并将其存储在整个应用程序中可用的常量中。qco9c6ql3#
将下面的代码放在位于应用程序根文件夹中的文件中,并在每次页加载时包含它。
然后,无论本地副本是否在子目录
folder
中,您都可以简单地执行$path = ABSPATH . '/path/to/file.php';
。如果您的应用程序已经有一个文件包含在每个页面加载中,您可以简单地将上面的代码放到该文件中,它就会工作。
请注意,根据文件的位置,您可能需要添加额外的
dirname()
调用。为从Web应用根目录传递的每个目录添加一个调用。例如,如果您的webapp位于
/webapp/
中,而您的“global include”位于/webapp/includes/framework/init.php
中,则需要对上述代码进行如下修改:即:由于来自webapp根目录(
includes/framework
)的两个额外文件夹,导致2次额外dirname()
调用澄清
上面的代码应该在一个文件中,并且只在你的web应用程序中有一个文件。这个文件需要包含在每个页面加载中。
如果在任何处理之前已经包含了一个文件(如配置文件或其他文件),则可以将该代码复制并粘贴到该文件中。
dirname()
调用的次数取决于复制和粘贴代码的文件相对于Web应用程序根目录的深度。对于上面的示例,假定Web应用程序的根目录由~
表示。如果您将我的代码复制粘贴到
~/abspath.php
中,那么您需要一个dirname()
调用。如果您将我的代码复制粘贴到
~/includes/abspath.php
中,则需要两个dirname()
调用。如果你把我的代码复制粘贴到
~/includes/config/abspath.php
中,那么你需要三个dirname()
调用,现在我们假设这是它的最终位置。在
~/index.php
中,执行以下操作:并且您可以访问
ABSPATH
。在
~/dir/someOtherPage.php
中执行以下操作:并且您可以访问
ABSPATH
。这就是为什么我说,如果你已经有一个文件,其中包括在每个页面加载,它更简单的只是把上面的代码在它。只是要确保你相应地修改
dirname()
调用的数量。再次,这段代码是为了在只有一个文件。然后获取URL路径,从
ABSPATH
中删除DOCUMENT_ROOT
是一件简单的事情:yiytaume4#
$_SERVER['DOCUMENT_ROOT']
将为您提供htdocs的路径,然后您可以从那里开始编辑
$_SERVER['REQUEST_URI']
将始终从上面的示例url中为您提供/myapp/stuff/to/see
,而不管文件在磁盘上的位置或从哪个文件调用它。因此,这仅仅是
explode
输入、array_shift
输入和implode
输入的问题。顺便说一句,从你的目录结构来看,你似乎在使用一个框架。一些框架有一个URI/URL库,你会发现它很有用(至少CodeIgniter有,其他框架不是100%肯定)
gtlvzcf85#
试试这个:
其中
__FILE__
是当前执行脚本的名称,dirname
从中获取文件夹/应用程序文件夹。其他选项:
**一个
pnwntuvh6#
基本上,在PHP中,如果一个文件'A.php'使用相对路径来引用一个资源,那么作为相对路径前缀的当前路径位置是包含'A.php'的顶级父php的位置。
如果A.php本身是顶级父文件夹,或者A.php与顶级父文件夹位于同一个文件夹,这就不会有问题,但如果不是这样,就会中断导入。
我发现的最好的解决方案是通过使用DIR(它给出了文件的当前位置)使引用显式绝对化,然后从这个位置转到refered by,例如DIR."/../help.php”引用位于A.php之上一级的文件help.php。
cig3rfwq7#
bramus/router就是这样做的
更新:
为了澄清这一点,如果您只需要相对于上面getBasePath()的资源路径,那么您可以使用
如果您的.php文件在
htdocs/myapp/
中,当前URL为http://www.server.com/myapp/stuff/to/see
如果您的.php文件在
htdocs/
中,当前URL为http://www.server.com/stuff/to/see