48

/ 在指向根文件夹的链接的开头在 php 包含中不起作用。

例如“/example/example.php”

解决办法是什么?

4

9 回答 9

65

我假设根文件夹是指您的 Web 文档根目录,而不是文件系统根目录。

为此,您可以

  • 将 web 根文件夹添加到包含路径,并且include('example/example.php')
  • 或者你可以include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')
于 2009-09-09T16:51:11.190 回答
34

我也有这个问题。Paul Dixon 的回答是正确的,但也许这会帮助您理解原因:

这里的问题是 PHP 是一种服务器端语言。纯 HTML 文档可以根据您在服务器上设置的根 url 访问文件(即,从您所在的任何子目录访问图像,您将使用/images/example.jpg从顶级目录向下访问),PHP 实际上访问使用时的服务器根目录include (/images/example.jpg)

您设置的站点结构实际上位于 Apache 服务器的文件系统中。我的站点根目录看起来像这样,从服务器根目录开始向下:

/home2/siteuserftp/public_html/test/

“test”代表您的站点根目录

所以要回答你的问题,为什么你的 PHP 包含没有得到你想要的结果(它完全按照它应该的方式工作)是因为你要求 PHP 代码尝试在服务器根目录中找到你的文件,而实际上它是位于您网站的 HTML 根目录中,类似于上面的内容。

您的文件将基于“test/”的站点根目录,看起来像这样:

/home2/siteuserftp/public_html/test/about/index.php

Paul Dixon 提供的答案:

include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')

正是解决您的问题的方法(不用担心试图找到文档根目录来替换“DOCUMENT_ROOT”,PHP 会为您做这件事。只要确保您的字面上有“DOCUMENT_ROOT”)

编辑:

更多信息 DOCUMENT_ROOT 和其他 PHP SERVER 变量可以在这里找到

于 2010-09-03T05:24:26.163 回答
5

include()(以及许多其他函数,如 require()、fopen() 等)都在本地文件系统上工作,而不是在 web 根目录下工作。

所以,当你做这样的事情

include( "/example/example.php" );

您正在尝试从 *nix 机器的根目录中包含。

虽然有多种方法可以处理您正在做的事情,但 Paul Dixon 的建议可能是您最好的选择。

于 2009-09-09T17:01:01.667 回答
5

每个 Web 服务器都有一个public_html文件夹,您通常在其中保存文件等。通过使用/,您将无法访问public_html,而是直接指向主(无法访问的)根目录。所以,$_SERVER['DOCUMENT_ROOT']."/your/locati.on"改用

于 2017-12-29T18:43:12.547 回答
2

我在运行 Windows 和 IIS 的机器上解决了这个问题:

<?php
  $docroot = 'http://www.example.com/';
  include ($docroot.'inc-header.php');
?>

如果您在本地开发机器上,您可以通过在 C:\Windows\System32\drivers\etc\hosts 中添加以下内容来强制您的域指向 localhost

127.0.0.1   www.example.com

此外,您需要像这样在 php.ini 中启用 allow_url_include

allow_url_include = On
于 2015-10-23T21:00:10.143 回答
1

对我来说,以下技巧奏效了。我正在使用带有 IIS 的 Windows,所以 DOCROOT 是 C:\Inetpub\wwwroot。

  1. 将 C:\Inetpub\wwwroot 替换为驱动器。让它成为W:(WEB内容)。
    subst W: C:\Inetpub\wwwroot
  1. 以这种方式编辑 php.ini:将 W:\ 附加到 include_path,将 doc_root 更改为 W:\
include_path = ".;c:\php\active\includes;W:\"
doc_root = W:\

  1. 将 subst 命令放入 Startup 文件夹中的 CMD 文件以自动进行映射。

现在,两个版本都允许:

    包括'/common/common.inc';// 访问映射的 W: root
    包括“common/common.inc”;// 访问 W: 在 include_path 中

于 2015-12-24T12:20:50.297 回答
0

这个答案并不是真正针对根目录,但一种解决方法是使用../跳转到父目录。
当然,您需要知道这种方法的文件结构。

例如,您可以使用:

include('../parent.php');
include('../../grand_parent.php');
于 2020-12-22T18:55:23.677 回答
0

也许这有点不合常规

如果我有这样的情况

/var/www/namedir/  <= root

/var/www/namedir/example/example.php <= file to include

-- directory when i need the include -- 
/var/www/namedir/dir1/page.php 
/var/www/namedir/dir1/dirA/page.php
/var/www/namedir/dir1/dirB/page.php

我使用的解决方案很简单。获取“Dir1”之前的路径

像这样的东西

include (substr(dirname(__FILE__),0,strpos(dirname(__FILE__), '/dir1'))."/example/example.php");

我发现它很有用,我需要重命名主子目录,例如从

/var/www/namesite/internalDirA/dirToInclude/example.php  
/var/www/namesite/internalDirA/dir1/dirA/example.php 
/var/www/namesite/internalDirA/dir1/dirB/example.php 

/var/www/namesite/dirReserved/dirToInclude/example.php  
/var/www/namesite/dirReserved/dir1/dirA/example.php 
/var/www/namesite/dirReserved/dir1/dirB/example.php 
于 2019-09-18T11:03:07.477 回答
0

某些版本的 PHP 可能在文档根目录的末尾有分隔符,而其他版本可能没有。作为一个实际问题,您可能想要使用:

    $r = trim(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT', FILTER_SANITIZE_STRING));
    if (substr($r, 0, 1) == '/')
    {
      define("PATCH_SEPARATOR", "/");  
    }
    else
    {
      define("PATCH_SEPARATOR", "\\");    
    }

    if (substr($r, -1) == PATCH_SEPARATOR)
    {
      include_once ($r . 'example/example.php');
    }
    else
    {
      include_once ($r . PATCH_SEPARATOR . 'example/example.php');
    }
于 2017-06-25T15:16:40.673 回答