[英]How can I get the “application root” of my URL from PHP?
如果我的URL是http://www.server.com/myapp/stuff/to/see
并且我的磁盘上的目录结构是htdocs/myapp/*
,我该如何提取/myapp
部分? 如果没有应用程序文件夹且应用程序root只是'/',该怎么办? 是否有预定义的变量来获取该值?
我想要的是一个能够修剪/myapp
关闭请求URI的函数,这样我只剩下/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,我想知道如何得到我上面提到的。
当您使用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']
/myapp/stuff/to/see
$_SERVER['REQUEST_URI']
/myapp/stuff/to/see/index.php
$_SERVER['SCRIPT_NAME']
和$_SERVER['PHP_SELF']
对于Web根目录 ,有几个答案中指出的DOCUMENT_ROOT
。 对于应用程序根目录 ,系统无法告知应用程序中的哪个文件夹是根文件夹。 您必须手动设置。
大多数应用程序使用dirname(__FILE__);
定义应用程序根目录dirname(__FILE__);
或配置设置并将其存储在整个应用程序中可用的常量中。
<?php
define('ABSPATH', dirname(__FILE__));
将以下代码放在位于应用程序根文件夹中的文件中,并将其包含在每个页面加载中。
然后,你可以简单地总是做$path = ABSPATH . '/path/to/file.php';
$path = ABSPATH . '/path/to/file.php';
无论您的本地副本是否在子目录folder
。
如果您的应用程序已经有一个文件包含在每个页面加载中,您只需将上面的代码放在该文件中即可。
请注意,您可能必须添加其他dirname()
调用,具体取决于该文件的位置。 为从webapp的根目录传递的每个目录添加一个。
例如,如果您的webapp位于/webapp/
并且您的“global include”位于/webapp/includes/framework/init.php
,则上述代码需要进行修改:
define('ABSPATH', dirname(dirname(dirname(__FILE__))));
dirname()
个额外的dirname()
调用,因为来自webapp根目录的两个额外文件夹( 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()
调用的数量。 同样,此代码仅用于一个文件。
然后获取URL路径,这是删除DOCUMENT_ROOT
FROM ABSPATH
的简单问题:
$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
define('RELADDR', substr(ABSPATH, strlen($docRoot));
$_SERVER['DOCUMENT_ROOT']
将为您提供htdocs的路径,然后您就可以从那里开始
编辑
$_SERVER['REQUEST_URI']
将始终从上面的示例网址中提供/myapp/stuff/to/see
,无论磁盘上的文件位置或从哪个文件调用它。
所以它只是explode
, array_shift
和内implode
。
顺便说一句,从您的目录结构来看,您似乎正在使用框架。 一些框架有一个你可以发现有用的URI / URL库(至少CodeIgniter有,而不是100%肯定与其他框架)
尝试这个:
echo dirname(__FILE__);
其中__FILE__
是当前执行脚本的名称, dirname
从中获取文件夹/应用程序文件夹。
更多选择:
echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir
我遇到了类似的问题。 基本上,在PHP中,如果文件'A.php'使用相对路径来引用资源,那么用作相对路径的前缀的当前路径位置是包含'A.php'的顶级父php。
如果A.php本身是顶级父级,或者当A.php与其顶级父级位于同一文件夹中时,这将不会成为问题。 但它会破坏进口。
我找到的最好的解决方案是通过使用DIR (它给出文件的当前位置)明确地使引用明确,然后从这个位置转到引用,例如DIR 。“/../ help.php”指的是一个文件help.php坐在A.php上方1级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.