根路径在使用PHP include时无法正常工作。

49

在链接开头加上“/”以到达根文件夹在 PHP include 中不起作用。

例如“/example/example.php”

解决方案是什么?

9个回答

69
我假设你所说的根文件夹是指你的网页文档根目录,而不是文件系统的根目录。
为此,你可以选择以下两种方式之一:
1. 将网页根目录添加到include path中,并使用include('example/example.php')进行包含。
2. 或者你可以使用include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')进行包含。

还要确保运行 PHP 的用户有访问那个文件夹的权限。 - Eric J.
当我尝试使用 $_SERVER['DOCUMENT_ROOT'] 时,我得到了 "unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING" 的错误信息。你知道为什么吗? - EllaJo
有人知道是否有一种方法可以设置包含文件的根目录吗?例如:include_path = "mysite.com/images/";include "./content/index.php";//以下是/content/index.php中的内容 //我希望它获取mysite.com/images/img1.jpg<img src="./img1.jpg" /> - Damien Golding
这在IIS服务器上不起作用。因为在安装在Windows IIS服务器上的PHP中,$_server['document_root']不可用。我添加了一个适用于IIS服务器的解决方案,但被管理员删除了。 - Srikanth Kondaparthy
难道简单地遍历目录不是一个可接受的解决方案吗?文件系统的根应该保持不变,除非您正在运行专用机器,否则您的http根文件夹也应该保持不变(我想是这样的吧?)。所以你不能这样做,比如/home/username/public_html/吗?在页面上写下这个路径让任何人都能读到是不是一个坏主意呢? - Soundfx4
没事,我从这里的另一个问题得到了答案。共享主机可以随时移动您的网站根目录,这将打破该路径:| 哎...那就算了 :D - Soundfx4

35

我也遇到了这个问题。Paul Dixon的回答是正确的,但也许这会帮助你理解为什么:

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

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

/home2/siteuserftp/public_html/test/
"test"代表您的网站根目录。因此,回答您的问题,为什么您的PHP include没有得到您想要的结果(它正按照应该的方式工作),是因为您正在要求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变量的更多信息可以在此处找到。


5

include()函数(以及其他许多类似require()、fopen()等的函数)都是基于本地文件系统而非Web根目录工作的。

因此,当您执行以下操作时:

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

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

虽然有很多方法可以处理您正在进行的操作,但Paul Dixon的建议可能是最好的选择。


5
每个Web服务器都有一个名为public_html的文件夹,通常您会在其中存储文件等。使用/时,您将无法进入public_html,而是直接进入主(不可访问)根目录。因此,请改用$_SERVER['DOCUMENT_ROOT']."/your/locati.on"

1
起始斜杠适用于 stylesheets/script/href 标签。 - MR_AMDEV

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

1
对我来说,以下技巧起作用了。 我使用的是带有IIS的Windows,因此DOCROOT是C:\ Inetpub \ wwwroot。
1.将C:\ Inetpub \ wwwroot的subst更改为驱动器。让它成为W:(WEB内容)。
subst W:C:\ Inetpub \ wwwroot
2.以这种方式编辑php.ini:将W:附加到include_path,将doc_root更改为W:
include_path =“。; c:\ php \ active \ includes; W:\” doc_root = W:
3.将subst命令放入启动文件夹中的CMD文件中,以使映射自动完成。
现在,两个版本都被允许:
include'/ common / common.inc'; //访问映射的W:根 include'common / common.inc'; //在include_path中访问W:

不要使用“subst”命令,而是通过调整注册表来使用“persistent subst”:REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices] "W:"="\\??\\C:\\Inetpub\\wwwroot" - Andrey Baluevsky

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');
    }

0

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

例如,你可以使用:

include('../parent.php');
include('../../grand_parent.php');

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接