繁体   English   中英

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

[英]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 ,无论磁盘上的文件位置或从哪个文件调用它。

所以它只是explodearray_shift和内implode

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

尝试这个:

 echo dirname(__FILE__);

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

更多选择:

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

在PHP.net上

我遇到了类似的问题。 基本上,在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM