PHP包含绝对路径

Posted

技术标签:

【中文标题】PHP包含绝对路径【英文标题】:PHP include absolute path 【发布时间】:2014-05-19 16:17:05 【问题描述】:

我的网站上有一个名为 $basePath 的变量,它设置为:

$basePath = '/Systems/dgw/';

我在我所有的 css、js 和图像标签上都使用它(为了更好的可见性而缩短):

<link href="<?php echo $basePath; ?>include/assets/css/bootstrap.min.css">

我对这些包含没有任何问题,它们在任何文件和我所在的任何文件夹中都可以正常工作。

我有一个包含以下内容的页面:

<img src="<?php echo $basePath; ?>images/new_logo.png" />

而且图像显示得很好。它后面的行是:

<?php include($basePath.'include/assets/common/topMessages.php');?>

但包含不会发生。当我这样尝试时:

<?php include('../../include/assets/common/topMessages.php');?>

有效。

有人知道哪里出了问题吗?

【问题讨论】:

echo 没有包含任何东西…… 抱歉,复制了错误的行。固定。 基本上,您的 webroot (即www.example.com/ 是您网站的根)和(unix)文件系统的根之间存在区别。 webroot 映射到文件系统中的路径;通常www.example.com/ 被映射到类似/var/www/example.com/http_docs/ 的东西。您的网络服务器会自动将任何对/a/b/c 的请求转换为/var/www/example.com/http_docs/a/b/c。但是,当您通过 PHP 包含文件时,不会要求网络服务器转换路径,因此它会在您的文件系统中查找 /a/b/c,这显然不存在。 【参考方案1】:

你不能这样包含相对于你的 webroot 的 php 文件,因为如果你使用斜杠作为第一个字符,引用将比你的文档根目录更深入。因此,您可以执行以下操作,而不是使用基本路径:

<?php 
   $path = $_SERVER['DOCUMENT_ROOT'];
   $path .= "/yourpath/yourfile.php";
   include_once($path);
?>

【讨论】:

【参考方案2】:

如果你的服务器没有填充“document_root”,你可能需要这个


    require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

我使用这行代码。它返回到站点树的“顶部”,然后转到所需的文件。 例如,假设我有这个文件树: domain.com/aaa/index.php domain.com/bbb/ccc/ddd/index.php domain.com/_resources/functions.php 无论我身在何处,我都可以通过复制粘贴来包含 functions.php 文件

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

如果你需要多次使用这段代码,你可以创建一个函数,返回 "str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/') -1))”部分。然后只需将此函数插入​​到您包含的第一个文件中。我有一个“initialize.php”文件,我包含在每个 php 页面的最顶部,其中包含此函数。下次我必须包含文件时,实际上我只是使用该函数(名为“path_back”):

require(path_back()."/_resources/another_php_file.php");

【讨论】:

很好的解决方案!但对于根级别的文件失败。【参考方案3】:

您可以将include_path = ".:/home/myuser/mysite.com/" 添加到您的php.ini,或者您可以在includerequire 之前将类似的内容添加到您的脚本中:

set_include_path(get_include_path() . ":/home/myuser/mysite.com/");

第一个适用于您网站中运行的所有脚本。

第二个选项仅适用于代码中包含setincludepath 的脚本,对于应用程序的其余部分,除非您在每个添加了setincludepath 的脚本中调用了一个对象,否则它将不起作用。

【讨论】:

以上是关于PHP包含绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

php获取上级文件绝对路径

PHP绝对路径的问题

文件加载路径-文件嵌套包含

PHP:从绝对 URL 获取绝对路径

PHP获取文件绝对路径的代码(上一级目录)

php开发中,取绝对路径$_Site_Roots = substr(dirname(__FILE__), 0, -4)