PHP动态获取将包含在其他文件中的特定文件的完整绝对URL路径


PHP Dynamically get complete Absolute URL Path for specific file that will be included in other files

我有一个配置文件。这不是一个独立的文件。我将使用require()将这个文件包含在我想要使用的页面的顶部。我想动态地获取该配置文件的完整绝对url路径,而不管它的位置如何,并将其作为常量存储在其内部。例如:

物理位置:(根目录)/my_folder/configuration.php

需要URL为:www.mydomain.com/my_folder/configuration.php

物理位置:(根目录)/demos/my_folder/configuration.php

需要URL为:www.mydomain.com/demos/my_folder/configuration.php

物理位置:(根目录)/demos/site1/my_folder/configuration.php

需要URL为:www.mydomain.com/demos/site1/my_folder/configuration.php

物理位置:(根目录)/demos/site2/my_folder/configuration.php

需要URL为:www.mydomain.com/demos/site2/my_folder/configuration.php

到目前为止很简单?以下是真正需要的,并使其变得复杂(IMO)。考虑一下:

配置文件位于:www.mydomain.com/demos/site2/my_folder/configuration.php

具有嵌套文件夹:www.mydomain.com/demos/site2/1/2/3/index.php

当我按照上面的URL访问"3"子文件夹中的index.php文件时,我需要配置文件的路径为www.mydomain.com/demos/site2/my_folder/configuration.php,而不是www.mydomaincom/demos/site2/1/2/3/my_folder/configuration.php

我该如何实现上述目标?

如果您可以依赖$_SERVER[ 'DOCUMENT_ROOT' ]的值,那么在configuration.php:内部

$path = substr( __FILE__, strlen( $_SERVER[ 'DOCUMENT_ROOT' ] ) );
$url = "www.mydomain.com{$path}";

如果它适合您的用例,您可以使用$_SERVER[ 'HTTP_HOST' ]使其更加动态;

DOCUMENT_ROOT

我在开发中大量使用了DOCUMENT_ROOT,因为它通常是唯一可用于构建某些自引用路径的动态变量。有一个关于DOCUMENT_ROOT处理不力的Apache错误通知单(#26052),特别是Apache不允许您使用RewriteRule设置值,并且在使用mod_vhost_alias时没有将其设置为合理的值。讨论持续了7-8年,因为可能来自Apache项目的人拒绝改变行为,直到他们最终在2.4.1中改变了行为。(我以前对此进行了研究,但现在我忘记了确切的变化是什么,以及它们是多么令人满意。)

如果你看一下票上的评论,你会看到人们用以下评论来抵制行为的改变:

不要信任DOCUMENT_ROOT变量。

DOCUMENT_ROOT现在、过去和将来都不是查找web内容的文件系统路径的可靠方法。

因此,我建议阅读这张票上的评论,看看人们在说什么——使用它的注意事项。我已经成功地使用了它,不知道有什么更好的方法可以在DOCUMENT_ROOT可用并提供必要数据的情况下实现同样的事情。

我使用的是:

define('URL', dirname(substr($_SERVER['SCRIPT_FILENAME'], strlen( $_SERVER[ 'DOCUMENT_ROOT' ] ) )).'/');