【问题标题】:PHP include absolute pathPHP包含绝对路径
【发布时间】: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" alt="logo"/>

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

<?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,这显然不存在。

标签: php include relative-path include-path absolute-path


【解决方案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 的脚本中调用了一个对象,否则它将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多